flask

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

#创建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’)

单独获取访问浏览器

  1. 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"
}
#字典转化为json字符串
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('http://bilibili.com')
#站外
return flask.redirect(flask.url_for('dx1')) #写入函数名

@app.route('/rd1')
def dx1():
return '你来了宝贝'

3. 404重定向

1
2
3
4
5
#404重定向
@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
#url别名
@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

#设置cookie
@app.route('/login')
def login():
response = flask.make_response("登入")
# 设置cookie
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():
#读取cookie
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

#删除cookie
@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
#设置session
@app.route('/slogin')
def slogin():
session['u_id']="2"
session['vip']='1'
return '登入'
pass

@app.route('/sget')
def sget():
#读取session
u_id = session['u_id']
vip = session['vip']
return flask.render_template('cookie_test.html',uid=u_id,vip=vip)
pass

#删除session
@app.route('/slogout')
def slogout():
session.pop('u_id', None)
session.pop('vip', None)
#其他删除方法
#session['u_id']=False

#全部删除
#session.clear()
return '登出'
pass

几种session的删除方法:

  1. session.pop(‘—‘, None)

  2. session[‘—‘] = False

  3. 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*"/>


flask
http://example.com/2023/12/16/flask/
Author
w1t2f3
Posted on
December 16, 2023
Licensed under