python中flask的相关基本操作
[TOC]
一、基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import flask from flask import Flask
app = Flask(__name__)
@app.route('/a') def a_page(): return "this is a page" pass
@app.route('/') def index(): return "hello" pass
if __name__ == '__main__': app.run(host='0.0.0.0',port=8888,debug=True)
|
二、请求和参数
1. 参数传入
建立当前项目目录下创建static和templates文件夹
1 2 3 4 5 6 7
| from flask import Flask
app = Flask(__name__, static_url_path='/static', static_folder='static', template_folder='templages' )
|
此时便可通过路由访问文件中的1.jpg了
2. 交互
2.1 ‘/’直接传参
1 2 3 4
| @app.route('/a/<user_id>/<int:user_pass>') def a_page(user_id,user_pass): return "this is %s--%s "%(user_id,user_pass) pass
|
添加路由/whk/123456
2.2 ?传参
1 2 3 4 5 6
| @app.route('/a',methods=['GET']) def a_page(): user_id = request.args.get('uid') user_pass = request.args.get('upass') return "this is %s--%s "%(user_id,user_pass) pass
|
ttp://10.0.132.18:8888/a?uid=whk&upass=123456
三、用户信息获取
1.request.method
获取请求类型
2.request.headers
获取请求头
2.1 request.headers.get(‘User-Agent’)
单独获取访问浏览器
- request.path 获取路径
request.full_path 完整路径
四、字典与json
1.字典转化为json
json.dumps()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from flask import json
@app.route('/d') def dict(): json_dict = { "name":"whk", "age":"19", "score":"100" } result = json.dumps(json_dict)
return result
|
2.json转化为字典
dict1 = json.laods('{"name":"whk","age":"19","score":"100"}')
五、重定向
1.站外重定向
1 2 3 4
| @app.route('/redirect') def cdx(): return flask.redirect('http://bilibili.com')
|
2.站外重定向
1 2 3 4 5 6 7 8 9 10 11
| @app.route('/redirect') def cdx(): return flask.redirect(flask.url_for('dx1'))
@app.route('/rd1') def dx1(): return '你来了宝贝'
|
3. 404重定向
1 2 3 4 5
| @app.errorhandler(404) def page_not_found(e): return '出错了 404 not-found',404 pass
|
六、url别名
某个路由太长,可以使用url别名
1 2 3 4 5 6 7 8 9 10
| @app.route('/solongsolongsolong',endpoint='connect') def index(): return "hi" pass
@app.route('/short') def tx1(): return flask.redirect(flask.url_for('connect')) pass
|
七、异常处理
1. 假异常
于return后面加入一个404
1 2 3 4
| @app.route('/fake') def index(): return "hello",404 pass
|
页面可以打开,但返还的请求值为404
可以应用于防御黑客的扫描,让其忽视404页面
2. 主动抛出异常
flask.abort(404)
1 2 3 4 5
| @app.route('/') def index(): flask.abort(404) return "hello",404 pass
|
八、html返回
1 2 3 4 5 6
| from flask import Response
@app.route('/') def index(): return Response('html代码',200) pass
|
九、模块
1.链接html文件
在templates建立html文件
retern flask.render_template(“xxx.html”)
1 2 3 4 5 6 7 8 9 10
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>c路由测试</title> </head> <body> <h1>this is h1</h1> </body> </html>
|
1 2 3 4
| @app.route('/c') def moban(): return flask.render_template("temp.html") pass
|
接着就可以直接由c路由访问到html文件了
2. 父模块
父模板
建立一个子HTML
在子HTML写入
1
| {% extends 'temp.html‘ %}
|
修改路径到zi1.html
1 2 3 4
| @app.route('/c') def moban(): return flask.render_template("zi1.html") pass
|
最后就可知直接访问到temp.html了
3. 继承
有时候会经常用到同一html页面,此时可用子模版继承方法
关键语句
{% block contenBlock %}`**
**`{{super()}}`** #继承语句,没有则不继承
**`{% endblock %}
1 2 3 4 5 6 7 8 9
| # 子模版 {% extends 'temp.html' %}
{% block contenBlock %}
{{super()}} <h2>这是子模版</h2>
{% endblock %}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 父模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>c路由测试</title> </head> <body> <h1>this is father temp</h1>
{% block contenBlock %} <h1>这是继承的父模板</h1> {% endblock %}
<h1>end</h1> </body> </html>
|
此时访问效果
十、过滤器
1 2 3 4 5 6 7
| @app.template_filter('rever') def do_reverse(li): temp = list(li) temp.reverse() return temp pass
|
<h2>u_list is {{ulist | rever}}</h2>
十一、控制代码块
{%....%}
eg1:遍历列表中的元素,并使用html规则打印在屏幕上
1 2 3 4 5
| {% for i in ulist %}
<li>{{i}}</li>
{% endfor %}
|
结果如下:
eg2:判断是否为vip并给出相应的反馈
还是刚刚那个路由
1 2 3 4 5 6 7
| @app.route('/c/<id>') def moban(id): u_id = id u_list = ['a','b','c','d'] u_vip = 1 return flask.render_template("zi1.html",uid=u_id,ulist=u_list,vip=u_vip) pass
|
后端
1 2 3 4 5
| {% if vip == 0 %} <h2>你不是vip</h2> {% elif vip == 1 %} <h2>您是一级vip</h2> {% endif %}
|
结果:
并且通过检查并不能查看后端完整代码
十二、cookie交互
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| from flask import request
@app.route('/login') def login(): response = flask.make_response("登入") response.set_cookie('u_id','1',max_age=300) response.set_cookie('vip','0', max_age=300) return response pass
@app.route('/get') def get(): u_id = request.cookies.get('u_id') vip = request.cookies.get('vip') return flask.render_template('cookie_test.html',uid=u_id,vip=vip) pass
@app.route('/logout') def logout(): response = flask.make_response("退出") response.delete_cookie('u_id') response.delete_cookie('vip') return response pass
|
1 2 3 4 5 6
| <h3>{{uid}} 号用户</h3> {% if vip == '0' %} <h2>你不是vip</h2> {% elif vip == '1' %} <h2>您是一级vip</h2> {% endif %}
|
Tips:
max_age为cookie最长存放时间,以秒计时
设置参数要加引号,html中判断同样要引号
十三、session
session是服务器为了保存用户状态而创建的一个特殊的对象
用flask设置session首先得配置加密字符串
1 2 3 4 5 6
| from datetime import timedelta from flask import session
app.config['SECRET_KEY'] = "key123" app.config['PERNAMENT_SESSION'] = timedelta(hours=1)
|
接着继续设置session的存储
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @app.route('/slogin') def slogin(): session['u_id']="2" session['vip']='1' return '登入' pass
@app.route('/sget') def sget(): u_id = session['u_id'] vip = session['vip'] return flask.render_template('cookie_test.html',uid=u_id,vip=vip) pass
@app.route('/slogout') def slogout(): session.pop('u_id', None) session.pop('vip', None)
return '登出' pass
|
几种session的删除方法:
session.pop(‘—‘, None)
session[‘—‘] = False
session.clear() #删除全部session
十四、表单处理
前端
1 2 3 4 5
| <form method="post" action="/chuli"> 用户名:<input type="text" name="uname"/><br> 密码:<input type="password" name="passwd"/><br> <input type="submit" value="提交"/> </form>
|
后端
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @app.route('/test1') def test1(): return render_template('biaodan_test.html') pass
@app.route('/chuli',methods=['POST']) def chuli(): if request.method=='POST': username = request.form.get("uname") password = request.form.get("passwd") print("用户名提交了"+username+"密码提交了"+password) return render_template('chuli.html') pass
|
关键语句:
在路径后加上——methods=[‘POST’]
获取表单中的数据——request.form.get(“passwd“),
参数对应前端代码中name的值密码:<input type="password" name="*passwd*"/>