flask python实现的web开发微框架,小而美,丰富的周边扩展,免费开源。
https://github.com/pallets/flask 官方源码
安装:
pip install flask
(pip install flask --timeout=99999)
换源 pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple/
验证:
>>> python
>>> import flask
>>> flask.__version__
'2.0.2'
配置调试模式:
app = Flask(__name__)
app.debug = True
if __name__==‘__main__’:
app.run(debug=True))
MTV:模板template
@app.route('/') @app.route('/index.html') def index(): user = { 'name':'张三' } return render_template('index.html',user = user) if __name__=="__main__": app.run()
2.其他方式:flask的启动
第一步:设置环境变量,自动启动
windows:set FLASK_APP =flask.py
*linux: export FLASK_APP =flask.py(app.py)
第二步:flask run 启动内置web服务器,指定IP及端口
flask run --host =0.0.0.0 --port -8001
或 flask run -h 0.0.0.0 -p 8001
3.其他方式:开启调试模式
windows:set FLASK_ENV =development
*linux: export FLASK_ENV =development
在重新返回上面的第二步,重新启动run
- 启动,app.run() 老方法
www.pypi.org
- WTF-表单,最后一个restful是接口相关的,获取数据接口
- 可以去https://pypi.org上搜索到更多的扩展资源,自己去找
常见的RUL协议:http,https,ftp
常见的http请求方式:POST,GET
GET,可以用于浏览器直接访问,请求可以携带参数,但是有长度限制,请求参数直接放在URL后面
POST,不能使用浏览器直接访问,对请求参数的长度没有限制,可以用来上传文件等需求
HTTP常见的状态码:
2xx 请求成功;3xx 重定向;4xx 请求错误;5xx 服务器错误。 详细的百度-HTTP状态码。
- 给到URL找到view的过程,就是路由的过程
- python的IDE就是pycharm
路由配置的两种方式:1,使用装饰器;2.使用API配置
# 路由配置使用装饰器 @app.route(url,methods) @app.route('/test') def hellotest(): # 视图函数 return 'hello world,test0222,测试函数'
# 使用API配置 app.add_url_rule(url,url_name,view_name) app.add_url_rule('/test-apimethod','apimethod',hellotest)
路由匹配规则:
匹配整个文字:@app.route('/hello')
传递参数:@app.route('/user/<参数>')
指定参数类型:@app.route('/post/<int:参数>')
查看URL路由规则:app.url_map
URL逆向解析(根据名称解析成URL字符串):
1.url_for(url_name,**kwargs)
2,静态文件(js,CSS,图片等)引用 url_for('static',filename='style.css')
视图函数中获取页面传值:
url中的值,可以设置默认值,也可以不设置,或者为None
- 如果page不传值会报错,路由上处理,并且添加一个默认值就好
@app.route('/user/<page>') def list_user(page=1):
路由分发:
上下文对象:应用上下文,请求上下文
在分派请求前,激活应用上下文和请求上下文,在请求处理完后,将其删除
应用上下文对象:current_app;g
current_app当前应用的实例 对象
g 处理请求时的临时存储对象,每次请求都会重设这个变量
请求上下文对象:request;session
request:请求对象,封装了客户端发出的http请求中的内容
session:用户会话(dict),各请求之间的数据共享
请求报文常用参数:
method:请求类型(GET,POST,OPTIONS等)
form:表示的是post请求过来的数据字典
args:表示的是get请求过来的数据字典
values:表示的是post和get请求过来的数据字典集合
files:上传的文件数据dict
cookies:请求中的cookie dict
headers:HTTP请求头
html方如何参数传递到服务器:http://192.168.1.6:8001/test/req?page=2&name=mark
- ?page=2&name=mark 参数传递 英文输入下
@app.route('/test/req') def test_request(): '''请求报文练习''' get_args = request.args print('get_args',get_args)# get请求参数获取 print(get_args.get('page',1)) # 请求中没有传入page值,那么可以设置默认值 print(request.args.get('name')) # 获取服务器所在的主机IP地址 headers = request.headers print(headers) print('host',headers.get('host')) # 获取请求用户的ip地址 user_ip = request.remote_addr print('user_ip',user_ip) print(request.remote_user) # 获取user-agent,可以用于爬虫 user_agent = request.headers.get('user-agent',None) print('User-Agent:','\n',user_agent) return 'request success'
请求钩子:
- 请求钩子函数的使用
- 常见的应用场景:before_first_request 链接数据库,只需要链接一次,后续调用即可
- before_request 使用场景举例;IP地址的拦截,每次请求之前都要拦截
@app.before_first_request def first_request(): """服务器启动后第一个请求到达前""" print('服务器启动后第一个请求到达前,first_request') @app.before_request def per_request(): """每一个请求到达前""" print('每一个请求到达前,per_request')
也可以通过构造对象正常修改
@app.route('/test/resp') def test_response(): """测试响应""" return '响应测试,reponse success',405,{ 'user_name':'mark','user_id':'mark_id2'} @app.route('/test/mkresp') def test_mkresponse(): '''使用make_response构造响应对象''' mkresp = make_response('这是一个响应对象',403,{ 'token':'abc123' }) mkresp.headers['user_name'] = 'nick_li' mkresp.status_code = 200 return mkresp @app.route('/test/htmlresp') def test_html_response(): '''响应html''' html = '<html><body><h1 style="color:red">这是一个HTML响应测试</h1></body></html>' resp = make_response(html) return resp @app.route('/test/html') def test_html(): '''从文件读取html''' html = render_template('test1.html') resp = make_response(html,400) # 都可以参考前面的使用 return resp
redirect() 重定向
abort() 处理错误
@app.route('/') def helloworld(): # 视图函数 # return 'hello world,susede' # 访问'/'时,重定向到'/test'页面 # return redirect('/test') # abort(403) # 触发一个异常,不需要return,会调用后续的forbidden函数 # ip 拦截 ip_list = ['127.0.0.2'] ip = request.remote_addr if ip in ip_list: abort(403) # 会调用后续的forbidden函数 return 'hello,sucess,welcome'
@app.errorhandler(403) def forbidden_page(err): """403错误提示:你没有权限访问页面""" print(err) return '你没有权限访问页面,请联系管理员开通权限'