Flask框架教程汇总(1)---视图/重定向/传参

2020-09-24 10:09:59 浏览数 (1)

本节目录:

1 完整的flask启动

2 视图函数传单个参数

3 参数类型

4 视图的响应

5 重定向—>redirect和url_for的结合

6 请求与响应

本教程的flask环境都是在ubuntu 16.04下 —python3.5—IDE为pycharm 如果有任何问题可以留言哦 !


使用 Flask, 需要先安装—->pip3 install flask

简介:flask是一个小的python web框架 只提供了一个强健的核心 其它功能都是提供扩展库来去实现的

一、完整的flask启动

创建一个名为manage.py的python文件, 并导入flask

代码语言:python代码运行次数:0复制
from flask import Flask
app = Flask(__name__) #__main__     manage
@app.route('/') #路由
def index(): #视图函数
    return 'Hello Flask'
if __name__ == '__main__:

    app.run()

此时直接运行run这个名为manage.py的文件,会看到控制台显示以下示例, 说明服务器启动成功, 然后打开本机浏览器输入

代码语言:javascript复制
http://127.0.0.1:5000/

即可看到 ‘Hello Flask’ 表示一个简单的flask项目运行了起来. (随后我们将不会再使用本方法启动服务器, 会换成manage方法启动,后面会有讲到)

代码语言:javascript复制
 * Serving Flask app "manage" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL C to quit)

路由

代码语言:javascript复制
@app.route('/')
def index(): #视图函数
    return 'Hello Flask'

启动参数

app.run()

(1) debug 默认为Flase True 调试模式 自动加载代码

(2) port 指定端口号

(3) host 指定主机名 host=’0.0.0.0’

(4) threaded 线程 True

二、视图函数传单个参数

(1) 使用无参路由

代码语言:javascript复制
@app.route('/') #路由
def index(): #视图函数
    return 'Hello Flask'

(2) 有参路由

带参路由

代码语言:javascript复制
@app.route('/find_girl/<name>')
def findGirl(name):
    return '找到了,名字是{}'.format(name)

三、参数类型

(1) string 默认就为字符串

(2) int 限制传递进来的参数为 int类型 不做类型的转换

(3) float 限制传递进来的参数为 float类型 不做类型的转换

(4) path 将请求的路由地址后面的所有参数 都认为是一个参数的值 不再做路由的查找

路由地址传递多

代码语言:javascript复制
@app.route('/many_arg/<a>/<b>')
def many_arg(a,b):
    print(a,b)
    return '传递多个参数'

注意事项

  1. 路由末尾的/建议都加上 因为在需要的时候 浏览器会自动帮你添加上
  2. 路由参数的限制 前面int/float/path/string 使用:和参数名称隔开
  3. path其实也是字符串类型 只是参数的/不再认为是路由的分隔符 而是认为是参数

四、视图的响应

(1) 手动构造响应

return ‘响应的内容’,code 状态码

(2) make_response 来构造响应

from flask import make_response

五、重定向

from flask import redirect,url_for

redirect 不传参数重定向

代码语言:javascript复制
@app.route('/redirect/')
def myRedirect():
    # return '正常请求'
    return redirect('/')#导入redirect  参数为路由地址

传参重定向

代码语言:javascript复制
return redirect('/')#导入redirect  参数为路由地址
带参数
return redirect('/many_arg/1/2')#导入redirect  

url_for

无参 参数为路由地址

代码语言:javascript复制
print(url_for('index')) #index是视图函数的名
print(url_for('indexxx')) #如果视图函数不存在 则抛出构造路由失败的异常

使用url__for构造带参路由
print(url_for('many_arg',a=1,b=2)) #index是视图函数的名

redirect和url_for的结合使用

代码语言:javascript复制
return redirect(url_for('many_arg',a=1,b=2)) #index是视图函数的名

abort 终止 抛出指定的状态码

必须是标准的http状态码

代码语言:javascript复制
    @app.route('/look_meizi/')
    def look_meizi():
        abort(500)
        # abort(404)

    #捕获指定的状态码  错误页面的定制
    @app.errorhandler(404)
    def page_not_found(e):
        return '你请求的地址被外星人挟持走了!!!'
        # return e

    @app.errorhandler(500)
    def server_error(e):
        return e

六、请求与响应

(1)current_app 当前app实例化的代理对象 获取当前实例化app的所有公共配置和实例化的app

实例

代码语言:javascript复制
    @app.route('/current_app/')
    def myGetConfig():
        # return app.config['secret_key']
        return current_app.config['secret_key'] #拿到app的所有的配置

(2) 全局变量g

在一次请求中 可以全局获取

例子和使用详见钩子函数或者模板

(3) request

请求对象 包含了所有的http的请求信息

代码语言:javascript复制
    @app.route('/request/')
    def get_http_message():
        print('获取完整的请求url',request.url) #获取完整的请求url
        print('获取去掉get传参的url',request.base_url)#获取去掉get传参的url
        print('获取主机名部分的url',request.host_url) #获取主机名部分的url
        print('获取路由地址',request.path) #获取路由地址
        print('获取请求的方法',request.method)
        print('获取get传参',request.args)
        获取指定key对应的值
        print('获取get传参',request.args['name'])
        print('获取get传参',request.args.get('name','该key不存在'))
        print('获取form表单传递过来的数据',request.form)
        print('获取form表单文件上传的数据',request.files)
        print('获取请求头信息',request.headers)
        print('获取cookie信息',request.cookies)
        print('获取传递过来的json',request.json)
        return  'request对象'

当get传参的key为相同时 的取值方式

request.args.getlist(key)

实例

代码语言:javascript复制
    请求的url http://127.0.0.1:5001/get_arg/?a=1&a=2&c=3
    @app.route('/get_arg/')
    def get_arg():
        # print(request.args)
        # print(request.args.get('a'))
        # print(request.args.get('a'))
        print(request.args.getlist('a')) #['a','b']
        return '获取多个get传参'

0 人点赞