basic use
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
configuration file
Introduce in app
app.config.from_object("settings.DevelopmentConfig")
settings
class BaseConfig(object):
DEBUG = True
SECRET_KEY = "随机字符串"
class ProductionConfig(BaseConfig):
DEBUG = False
class DevelopmentConfig(BaseConfig):
pass
class TestingConfig(BaseConfig):
pass
routing
a. 添加路由的两种方式:
from flask import Flask,render_template,redirect
app = Flask(__name__)
"""
1. 执行decorator=app.route('/index',methods=['GET','POST'])
2. @decorator
- decorator(index)
"""
# 路由方式一(*):
@app.route('/index',methods=['GET','POST'])
def index():
return "Index"
# 路由方式二:
def order():
return 'Order'
app.add_url_rule('/order',view_func=order)
if __name__ == '__main__':
app.run()
b. endpoint(默认函数名)
c. 传参数
@app.route('/index/<int:nid>',methods=['GET','POST'])
def index(nid):
print(nid,type(nid))
url_for('index',nid=888)
return "Index"
d. 自定义正则参数
from flask import Flask,render_template,redirect,url_for
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class RegexConverter(BaseConverter):
"""
自定义URL匹配正则表达式
"""
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex
def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
:param value:
:return:
"""
return int(value)
def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
:param value:
:return:
"""
val = super(RegexConverter, self).to_url(value)
return val
app.url_map.converters['xxx'] = RegexConverter
@app.route('/index/<xxx("\d+"):nid>',methods=['GET','POST'])
def index(nid):
print(nid,type(nid))
v = url_for('index',nid=999) # /index/999
print(v)
return "Index"
if __name__ == '__main__':
app.run()
e. 其他参数
- 重定向
from flask import Flask,render_template,redirect
app = Flask(__name__)
@app.route('/index',methods=['GET','POST'],redirect_to='/new')
def index():
return "老功能"
@app.route('/new',methods=['GET','POST'])
def new():
return '新功能'
if __name__ == '__main__':
app.run()
PS: 前端重定向
- meta/js
重点:
- url
- methods
- endpoint
- @app.route('/index/<int:nid1>/<int:nid2>/')
- url_for
view function
fbv (commonly used)
import functools
def wapper(func):
@functools.wraps(func)
def inner(*args,**kwargs):
print('before')
return func(*args,**kwargs)
return inner
@app.route('/xxxx',methods=['GET','POST'])
@wapper
def index():
return "Index"
cbv
class IndexView(views.MethodView):
methods = ['GET']
decorators = [wapper, ]
def get(self):
return 'Index.GET'
def post(self):
return 'Index.POST'
app.add_url_rule('/index', view_func=IndexView.as_view(name='index2')) # name=endpoint
request and response
request related
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
Response correlation
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
template
The calling method is basically the same as Django
session
- set: session['username'] = 'xxx'
- 删除:session.pop('username', None)
Blueprint
# 问题:模块化视图,把具体的视图给拆分出去,使用pytho模块制作的形式,解决文件引用的问题,
# 但是,模块制作解决不了url映射视图的问题;
# 引出蓝图:
# blueprint.py
from flask import Blueprint
from flask import Flask
# 1.创建蓝图对象
api = Blueprint('api',__name__) # 'api'表示蓝图的名称
# 2.使用蓝图路由
@api.route('/user')
def user():
return 'user'
# main.py # flask项目主文件
from flask import Flask
# 把拆分出去的文件导入程序启动文件
from blueprint import api
app = Flask(__name__)
# 3.注册蓝图路由到app上
app.register_blueprint(api)
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
# 如果在其他文件中使用蓝图的api
# extra.py
from flask import Flask
# 把拆分出去的文件导入程序启动文件
from blueprint import api
@api.route('/')
def extra_view():
return 'index'
# blueprint.py
from flask import Blueprint
# from extra import extra_view # 这样还是会造成循环导入;
# 解决循环导入的两种方式:1.from extra import * # 不建议使用
# 2.将导入操作放在执行代码后面,解决交错导入的问题;
api = Blueprint('api',__name__) # 'api'表示蓝图的名称
# 解决循环导入的问题
from extra import extra_view
@api.route('/user')
def user():
return 'user'
flash (message)
message是一个基于Session实现的用于保存数据的集合
其特点是:使用一次就删除。
@app.route('/x1',methods=['GET','POST'])
def login():
flash('我要上学校1',category='x1')
flash('我要上学校2',category='x2')
return "视图函数x1"
@app.route('/x2',methods=['GET','POST'])
def index():
data = get_flashed_messages(category_filter=['x1'])
print(data)
return "视图函数x2"
middleware
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方法
"""