本节目录:
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 '传递多个参数'
注意事项
- 路由末尾的/建议都加上 因为在需要的时候 浏览器会自动帮你添加上
- 路由参数的限制 前面int/float/path/string 使用:和参数名称隔开
- 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传参'