欢迎来到Louis的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

Flask - 响应对象,request,session

一.Flask简介

  Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎Flask使用BSD授权。

  Flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

二.Flask的response对象

1.HttpResoponse

  该对象在flask中表现为直接返回字符串格式的值.

from flask import Flask
# 创建Flask对象
app = Flask(__name__)

# 添加视图函数
@app.route('/home')
def home():
    return 'Home'

# 启动Flask实例,开启debug
app.run(debug=True)

2.render_template

  从flask中引入render_template,该对象配合jinja2进行模板渲染展示。

from flask import (redirect,
render_template)
@app.route("/")
def index():
    name = 'alex'
    # 渲染模版
    return render_template('index.html', name=name)

3.redirect

  路由重定向

@app.route("/login", methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    if request.form.get('username') in account_info.keys() and \
            request.form.get('password') == account_info[request.form.get('username')][0]:
        session['username'] = request.form.get('username')
    #登录成功跳转到'/'
        return redirect('/')
    else:
        return "用户名或密码错误!"

 4.jsonify

  返回标准的json数据

from flask import jsonify

@app.route("/json")
def json_data():
    # 将字典序列化成标准的json字符串,返回响应时在在响应头中加入content_type为application/json
    return jsonify({"name": 'alex'})

5.send_file

from flask import send_file

@app.route("/file")
def files():
    # 打开文件并返回文件内容,并将文件类型加入到响应头中
    return send_file('nv.jpg')

 6.make_response

  视图函数在返回响应时其实是可以接收三个参数的:

  • 响应字符串
  • 响应状态码
  • 响应头
@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    # 成功请求默认返回是200,这里改成201,修改Content-Type
    return (f'<p>Your browser is {user_agent}</p>', 201, {'Content-Type': 'text/html'})

 

   make_response也接收上面3个参数,并且返回一个response对象,有时候我们需要在视图函数中进行这种转换,然后在响应对象上调用各种方法,进一步设置响应。

from flask import Flask, request, make_response

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    # res为响应体对象
    res = make_response(f'<p>Your browser is {user_agent}</p>', 201, {'Content-Type': 'text/html'})
    # 在响应体上设置一个cookie
    res.set_cookie('name', 'alex')
    return res

 

7.abort

  还有一种特殊的响应有abort函数生成,用于处理错误

user_dict = {
    1: 'alex',
    2: 'wusir',
    3: 'mjj',
}


def load_user(id):
    return user_dict[id] if id in user_dict else None


@app.route('/user/<int:id>')
def get_user(id):
    user = load_user(id)
    if not user:
        abort(404)
    return f'<h1>Hello,{user}</h1>'

 

 

三.flask中的request

  request包含请求的全部信息,request需要从flask中导入。

request.method # 请求方式
request.form # 存放FormData中的数据 to_dict 序列化成字典
request.args # 获取URL中的数据 to_dict 序列化成字典
request.url # 访问的完整路径
request.path # 路由地址
request.host # 主机地址
request.values # 获取 FormData and URL中的数据 不要用to_dict
request.json  # 如果提交时请求头中的Content-Type:application/json 字典操作
request.data  # 如果提交时请求头中的Content-Type 无法被识别 将请求体中的原始数据存放 byte
request.cookies # 获取Cookie中的数据
request.headers # 获取请求头
request.files # 序列化文件存储 save()
@app.route("/login", methods=['GET', 'POST'])
def login():
    # 获取请求方式
    if request.method == 'GET':
        return render_template('login.html')
    # 获取formdata中的数据
    if request.form.get('username') in account_info.keys() and \
            request.form.get('password') == account_info[request.form.get('username')][0]:
        session['username'] = request.form.get('username')
        return redirect('/')
    else:
        return "用户名或密码错误!"

四.jinja2模板语法

{{}} 引用变量 执行函数
{%%} 逻辑代码
|safe Markup 安全标签字符串
@app.template_global()
@app.template_filter()
{% macro create_input(na,ty) %}
{{ na }} : <input type="{{ ty }}" name="{{ na }}">
{% endmacro %}
{{ create_input("username","text") }}

后续具体补充

五.Flask 中的 Session

app.secret_key = "加密字符串" # 用于序列化和反序列化 session信息

# 设置secret_key
app.secret_key = 'asbhwui189asdnw'

# 定义校验登录装饰器
def login_require(func):
    def warrper(*args, **kwargs):
    # 判断session获取
        if not session.get('username'):
            return redirect('/login')
        return func(*args, **kwargs)
    return warrper
@app.route("/login", methods=['GET', 'POST'])
def login():
    # 获取请求方式
    if request.method == 'GET':
        return render_template('login.html')
    # 获取formdata中的数据
    if request.form.get('username') in account_info.keys() and \
            request.form.get('password') == account_info[request.form.get('username')][0]:
    # 登录成功设置session
        session['username'] = request.form.get('username')
        return redirect('/')
    else:
        return "用户名或密码错误!"

由于Flask中默认Session 存放位置 - 客户端的Cookies中
所以Session需要加密 用到 secret_key
请求进入视图函数 带上cookie 将Session从cookie序列化出来 通过secret_key 反序列化成字典

 

posted on 2019-01-09 15:21  Louiszj  阅读(482)  评论(0)    收藏  举报

导航