响应
from flask import Flask,render_template,redirect,request,jsonify,make_response
app = Flask(__name__)
@app.route('/index',methods=['GET','POST'])
def index():
# 请求相关
# request.method
# request.args
# request.form
# request.cookies
# request.headers
# request.path
# request.files
# obj = request.files['the_file_name']
# obj.save('/var/www/uploads/' + secure_filename(obj.filename))
# request.values
# request.full_path
# request.script_root
# request.url
# request.base_url
# request.url_root
# request.host_url
# request.host
# 响应相关
return ""
return json.dumps({}) # return jsonify({})
return render_template('index.html',n1=123)
return redirect('/index')
# response = make_response(render_template('index.html'))
# response = make_response("xxxx")
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# response.delete_cookie('key')
# return response
if __name__ == '__main__':
app.run()
模板
from flask import Flask,render_template,redirect,request,jsonify,make_response,Markup
app = Flask(__name__)
def gen_input(value):
return Markup("<input value='%s'/>" %value)
@app.route('/x1',methods=['GET','POST'])
def index():
context = {
'k1':123,
'k2': [11,22,33],
'k3':{'name':'oldboy','age':84},
'k4': lambda x: x+1,
'k5': gen_input, # 当前模板才能调用的函数
}
return render_template('index.html',**context)
@app.template_global()
def sbbbbbbb(a1, a2):
return a1 + a2
if __name__ == '__main__':
app.run()
layout.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<div >头部</div>
<div>
{% block content %} {% endblock %}
</div>
<div >底部</div>
</body>
</html>
index.html
{% extends 'layout.html'%}
{% block content %}
<h1>{{k1}}</h1>
<h1>{{k2.0}} {{k2[0]}} </h1>
<h1>{{k3.name}} {{k3['name']}} {{k3.get('name',888)}}</h1>
<h1>{{k4(66)}}</h1>
<h1>{{k5(99)}}</h1>
<h1>{{sbbbbbbb(1,2)}}</h1>
{% endblock%}
浏览器输出
头部
123
11 11
oldboy oldboy oldboy
67
input文本(文本内容是99)
99
3
底部
session
from flask import Flask,session
app = Flask(__name__)
app.secret_key = 'sadfasdfasdf'
@app.route('/x1')
def index():
# 去ctx中获取session
session['k1'] = 123
session['k2'] = 123
return "Index"
@app.route('/x2')
def order():
print(session.get("k2"))
return "Order"
if __name__ == '__main__':
app.run()
然后在index
中,del session['k2']
,在order
中改成 print(session.get(“k1”))
before_request、after_request
from flask import Flask,render_template,redirect
app = Flask(__name__)
"""
before_reuqest = [xxxxxxxxxx1,xxxxxxxxxx2]
"""
@app.before_request
def xxxxxxxxxx1():
print('前1')
@app.before_request
def xxxxxxxxxx2():
print('前2')
"""
after_request = [oooooooo1,oooooooo2]
[oooooooo2,oooooooo1,] reversed(after_request)
"""
@app.after_request
def oooooooo1(response):
print('后1')
return response
@app.after_request
def oooooooo2(response):
print('后2')
return response
@app.route('/x1',methods=['GET','POST'])
def x1():
print('视图函数x1')
return "视图函数x1"
@app.route('/x2',methods=['GET','POST'])
def x2():
print('视图函数x2')
return "视图函数x2"
if __name__ == '__main__':
app.run()
浏览器http://127.0.0.1:5000/x1
控制台输出
前1
前2
视图函数x1
后2
后1
from flask import Flask,render_template,redirect
app = Flask(__name__)
@app.before_request
def xxxxxxxxxx1():
print('前1')
return "不要再来烦我了"
@app.before_request
def xxxxxxxxxx2():
print('前2')
@app.after_request
def oooooooo1(response):
print('后1')
return response
@app.after_request
def oooooooo2(response):
print('后2')
return response
@app.route('/x1',methods=['GET','POST'])
def x1():
print('视图函数x1')
return "视图函数x1"
@app.route('/x2',methods=['GET','POST'])
def x2():
print('视图函数x2')
return "视图函数x2"
if __name__ == '__main__':
app.run()
浏览器输入http://127.0.0.1:5000/x2
页面输出不要再来烦我了
控制台输出
前1
后2
后1
实现登陆验证
from flask import Flask,render_template,redirect,request,session
app = Flask(__name__)
app.secret_key = 'asdfasdfasdf'
@app.before_request
def check_login():
if request.path == '/login':
return None
user = session.get('user_info')
if not user:
return redirect('/login')
@app.route('/login',methods=['GET','POST'])
def login():
return "视图函数login"
@app.route('/index',methods=['GET','POST'])
def index():
print('视图函数x2')
return "视图函数index"
if __name__ == '__main__':
app.run()
中间件
from flask import Flask
app = Flask(__name__)
app.secret_key = 'asdfasdfasdf'
@app.route('/x2',methods=['GET','POST'])
def index():
print("x2")
return "x2"
class Middleware(object):
def __init__(self,old_wsgi_app):
"""
服务端启动时,自动执行
:param old_wsgi_app:
"""
self.old_wsgi_app =old_wsgi_app
def __call__(self, environ, start_response):
"""
每次有用户请求道来时
:param args:
:param kwargs:
:return:
"""
print('before')
from flask import session,request
obj = self.old_wsgi_app(environ, start_response)
print('after')
return obj
if __name__ == '__main__':
app.wsgi_app = Middleware(app.wsgi_app)
app.run()
"""
1.执行app.__call__
2.在调用app.wsgi_app方法
"""
浏览器输入http://127.0.0.1:5000/x2
控制台输出
before
x2
after
flash
from flask import Flask,session,flash,get_flashed_messages
app = Flask(__name__)
app.secret_key = 'asdfasdfasdf'
@app.route('/x1',methods=['GET','POST'])
def login():
flash('我要',category='x1')
flash('我要',category='x2')
return "视图函数login"
@app.route('/x2',methods=['GET','POST'])
def index():
data = get_flashed_messages(category_filter=['x1'])
print(data)
return "视图函数index"
if __name__ == '__main__':
app.run()
浏览器输入http://127.0.0.1:5000/x2
控制台输出[]
浏览器输入http://127.0.0.1:5000/x1(多刷新几次)
然后在输入http://127.0.0.1:5000/x2
会在控制台输出['我要', '我要', '我要', '我要', '我要']
然后取完毕,在输入http://127.0.0.1:5000/x2
控制台输出[]
项目结构
通过python manage.py启动项目
manage.py
from s8pro import app
if __name__ == '__main__':
app.run()
__init__.py
from flask import Flask
from .views import account
from .views import admin
from .views import user
app = Flask(__name__)
app.register_blueprint(account.ac)
app.register_blueprint(admin.ad)
app.register_blueprint(user.us)
account.py
from flask import Blueprint,render_template
import redis
ac = Blueprint('ac',__name__)
@ac.route('/login')
def login():
conn = redis.Redis()
return render_template('login.html')
@ac.route('/logout')
def logout():
return '大人'
login.html
<body>
<h1>用户登录</h1>
</body>
http://127.0.0.1:5000/login输出login.html信息
http://127.0.0.1:5000/logout 页面输出大人
还可以设置二级路由
admin.py
from flask import Blueprint
ad = Blueprint('ad',__name__,url_prefix='/admin')
@ad.before_request
def bf():
print('before_request')
@ad.route('/home')
def home():
return 'home'
@ad.route('/xxxx')
def xxxx():
return 'xxxx'
浏览器输出http://127.0.0.1:5000/admin/home
控制台输出before_request
user.py
from flask import Blueprint
us = Blueprint('us',__name__)
@us.route('/info')
def info():
return 'info'
项目依赖
- 项目依赖 pip3 install pipreqs
- 生成依赖文件:pipreqs ./
- 安装依赖文件:pip3 install -r requirements.txt