前言:
视频资料:b站路飞IT学城的Flask教程
内容回顾: 1.为什么要使用装饰器?写一个装饰器答:在不改变原函数的基础上,对函数执行前后进行定义操作
import functools # 装饰器 def wapper(func): @functools.wrap(func) def inner(*args,**kwargs): return func(*args,**kwargs) return inner """ 1.执行wapper函数,并将被装饰的函数当作参数。wapper(index) 2.将第一步的返回值,重新赋值给 新index=wapper(老index) """ # 验证 @wapper def index(a1): return a1+1000 v=index(999) print(v) print(index.__name__)#执行index函数的函数名 “”“ 输出: 1999 inner ”“”2.简单的flask
简单的flask例子
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
if __name__ == '__main__':
app.run()
1.配置文件
常用:‘DEBUG’,‘SECRET_KEY’
1.1方式一:app.config['DEBUG'] = True1.2方式二:
新建settings.py:
class Config(object): DEBUG = False TESTING = False DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config): DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config): DEBUG = True class TestingConfig(Config): TESTING = True
在app.py中:
app.config.from_object('.settings.TestingConfig')
2.路由
2.1 添加路由的方式+endpoint(默认函数名)+传参数
# 路由方式一
#或:@app.route('/index/')
@app.route('/index/',methods=['GET','POST'],endpoint='n1')
def index(post_id):
v1=url_for('n1')
print(v1)
print(url_for('n1',nid=888))
print(type(post_id))
"""
输出:
/index
/index/888
"""
return "Index"
2.2 @app.route参数:
| 参数名 | 含义 |
|---|---|
| rule | URL规则(网页地址) |
| view_func | 视图函数名称 |
| defaults=None | 默认值,当URL中无参数,函数需要参数时,使用defaults={‘k’:‘v’}为函数提供参数 |
| endpoint=None | 名称,用于反向生成URL,即: url_for(‘名称’) |
| methods=None | 允许的请求方式,如:[“GET”,“POST”] |
| strict_slashes=None | 对URL最后的 / 符号是否严格要求 |
| redirect_to=None | 重定向到指定地址 |
| subdomain=None | 子域名访问 |
# 请求相关信息
# 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(f.filename))
# request.values
# request.full_path
# request.script_root
# request.url
# request.base_url
# request.url_root
# request.host_url
# request.host
# 响应相关信息
# return json.dumps({}) return jsonify({})
# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html')
# response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response
5.模板
5.1 Jinjia
s1.py:
def gen_input(value):
return "" %value
#或 return Markup("" %value)
@app.route('/x1',methods=['GET','POST'])
def index():
context={
'k1':123,
'k2':[11,22,33],
'k3':{'name':'oldboy','age':},
'k4':lambda x:x+1
'k5':gen_input
}
index.html:
5.2 @app.template_global(){{k1}}
{{k2.0}} {{k2[0]}}
{{ka.name}} {{k3['name']}} {{k3.get('name',888)}}
{{k4(66)}}
{{k5(99)|safe}}
{k5(99)}} -->
@app.template_global() def sb(a1,a2): return a1+a2
5.3 模板继承{{sb(1,2)}}
{% extends 'layout.html'%}
{% block content %}
Content
{% endblock %}
6.session
app.secret_key=‘adsadasd12’
session是一个字典
from flask import flash,get_flashed_message
@app.route('/x1',methods=['GET','POST'])
def login():
flash('sss',category='x1')
flash('qqq',category='x2')
return "视图函数1"
@app.route('/x2',methods=['GET','POST'])
def index():
data=get_flash_messages(category_filter=['x1'])
print(data)
return "视图函数2"
8.蓝图 blueprint
8.1蓝图的作用
1.目录结构划分
2.url的划分
3.某类url的@before_request
文件目录:
|---s8pro(project) |---s8pro(package) |---static |---templates |---views |---__init__.py |---admin.py |---manage.py
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'
init.py:
from flask import Flask app=Flask(__name__) from .view import admin app.register_blueprint(admin.ad)
manage.py:
from s8pro import app if __name__='__main__': app.run()9.常见装饰器 9.1 @app.before_request @app.after_request
@app.before_request
def x1()
print('前1')
@app.before_request
def x2()
print('前2')
@app.after_request
def q1(response)
print('后1')
return response
@app.after_request
def q2(response)
print('后2')
return response
'''
输出:
前1
前2
后2
后1
'''
9.2 @app.before_request做登录验证
@app.before_request
def check_login():
if request.path=='/login':
return None
user=session.get('user_info')
if not user:
return redirect('/login')
9.3 @app.before_first_request
@app.before_first_request
def before_first_request1():
print('before_first_request1')
9.4 @app.errorhandler(404)
@app.errorhandler(404)
def page_not_found(error):
return 'This page does not exist', 404
10.中间件
class Middleware(object):
def __init__(self,old_wsgi_app):
self.old_wsgi_app=old_wsgi_app
def __call__(sefl,environ,start_response):
"""
每次有用户请求到来时
"""
print('before')
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方法
"""
11.补充
11.1 项目依赖: pip install pipreqs
- 生成依赖文件:pipreqs ./ --encoding=utf-8
- 安装依赖文件:pip install -r requirements.txt
from types import MethodType, FunctionType
class Foo(object):
def fetch(self):
pass
print(isinstance(Foo.fetch, MethodType))
print(isinstance(Foo.fetch, FunctionType)) # True
obj = Foo()
print(isinstance(obj.fetch, MethodType))
print(isinstance(obj.fetch, FunctionType)) # True



