Flask的使用
一、路由系统
1.子域名的配置
""" 可传入的参数: @app.route('/user/<username>') @app.route('/post/<int:post_id>',methods=['GET',"POST"],endpoint='fff') - subdomain(配置子域名的方法) www.baidu.com, - 现在本地hosts文件中找IP C:WindowsSystem32driversetc /etc/hosts from flask import Flask,render_template,request,redirect,session,url_for app = Flask(__name__) app.config['SERVER_NAME'] = 'bjg.com:5000' @app.route("/index",subdomain='<xxxxx>') def index(xxxxx): return "%s.bjg.com" %(xxxxx,) if __name__ == '__main__': app.run()
"""
#py
from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.config['SERVER_NAME'] = 'bjg.com:5000'
@app.route('/index/<int:nid>',methods=['GET',"POST"],endpoint='fff',defaults={'cid':777},strict_slashes=False)
def index(nid,cid):
print(nid,cid)
# v = url_for('fff',nid=888)
# print(v)
return "xxxx"
@app.route('/old',redirect_to='/new')
def old():
return "Old"
# /new
@app.route('/new')
def new():
return 'New'
admin.bjg.com:5000/index
@app.route("/index", subdomain="admin")
def admin_index():
return "admin.bjg.com"
@app.route("/index",subdomain='www')
def index():
return "www.bjg.com"
@app.route("/index",subdomain='<xxxxx>')
def index(xxxxx):
return "%s.bjg.com" %(xxxxx,)
if __name__ == '__main__':
app.run()
2.支持正则表达式
''' - 扩展Flask的路由系统,让他支持正则 from flask import Flask,url_for app = Flask(__name__) # 定义转换的类 from werkzeug.routing import BaseConverter 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 # 添加到converts中 app.url_map.converters['xxx'] = RegexConverter # 进行使用 @app.route('/index/<xxx("d+"):nid>',endpoint='xx') def index(nid): url_for('xx',nid=123) return "Index" if __name__ == '__main__': app.run() '''
#py
from flask import Flask,url_for
app = Flask(__name__)
# 定义转换的类
from werkzeug.routing import BaseConverter
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
# 添加到converts中
app.url_map.converters['xxx'] = RegexConverter
# 进行使用
@app.route('/index/<xxx("d+"):nid>',endpoint='xx')
def index(nid):
url_for('xx',nid=123)
return "Index"
if __name__ == '__main__':
app.run()
二、视图函数
flask除了支持FBV还支持CBV(包括CBV的正则表达式配置)
from flask import Flask,url_for,views
app = Flask(__name__)
# 进行使用
# @app.route('/index',endpoint='xx')
# def index(nid):
##反向生成URL
# url_for('xx',nid=123)
# return "Index"
#
# app.add_url_rule('/index',index)
def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner
class IndexView(views.MethodView):
# methods = ['POST']
#装饰器在CBV中的使用
decorators = [auth,]
def get(self):
v = url_for('index')
print(v)
return "GET"
def post(self):
return "GET"
app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))
if __name__ == '__main__':
app.run()
三、请求和响应
使用urllib转换网址上的中文,和16进制
from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response from urllib.parse import urlencode,quote,unquote app = Flask(__name__) @app.route('/index',endpoint='xx') def index(): from werkzeug.datastructures import ImmutableMultiDict get_data = request.args #转化成为字典 get_dict = get_data.to_dict() get_dict['xx'] = '18' # 获取URL url = urlencode(get_dict) print(url) print(request.query_string) print(request.args) val = "%E6%8A%8A%E5%87%A0%E4%B8%AA" print(unquote(val)) # # return "Index" # return "Index" # return redirect() # return render_template() # return jsonify(name='alex',age='18') response = make_response('xxxxx') response.headers['xxx'] = '123123' return response if __name__ == '__main__': # app.__call__ app.run()
四、模板语法
和Django基本相同,更贴近Django的基本语法,支持各种数据类型,还支持函数(自定义模板语法)
##################view视图 from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response,Markup from urllib.parse import urlencode,quote,unquote app = Flask(__name__) def test(a1,a2): return a1+a2 @app.template_global() def sb(a1, a2): return a1 + a2 + 100 @app.template_filter() def db(a1, a2, a3): return a1 + a2 + a3 @app.route('/index',endpoint='xx') def index(): v1 = "字符串" v2 = [11,22,33] v3 = {'k1':'v1','k2':'v2'} v4 = Markup("<input type='text' />") return render_template('index.html',v1=v1,v2=v2,v3=v3,v4=v4,test=test) if __name__ == '__main__': # app.__call__ app.run() #########模板base############### <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>模板</h1> {%block body %} {%endblock%} </body> </html> ############继承模板的HTML################# {% extends 'layout.html'%} {%block body %} {{v1}} <ul> {% for item in v2 %} <li>{{item}}</li> {% endfor %} </ul> {{v2.1}} <ul> {% for k,v in v3.items() %} <li>{{k}} {{v}}</li> {% endfor %} </ul> {{v3.k1}} {{v3.get('k1')}} {{v4}} <!--{{v4|safe}}--> <h1>{{test(1,19)}}</h1> {{sb(1,2)}} {{ 1|db(2,3)}} {% macro xxxx(name, type='text', value='') %} 《鸿》 <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %} {{ xxxx('n1') }} {%endblock%}
五、session
session的配置
from flask import Flask,session,Session from urllib.parse import urlencode,quote,unquote from werkzeug.local import LocalProxy app = Flask(__name__) app.secret_key ='sdfsdfsdf' app.config['SESSION_COOKIE_NAME'] = 'session_lvning' """ 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_REFRESH_EACH_REQUEST': True, 'PERMANENT_SESSION_LIFETIME': timedelta(days=31) """ @app.route('/index',endpoint='xx') def index(): # session本质上操作的是字典,假设session保存在数据库 # session['xxx'] = 123 # session['xx1'] = 123 # session['xx2'] = 123 # session['xx3'] = 123 # del session['xx2'] session['xx3'] = 123 return "xxx" if __name__ == '__main__': # app.__call__ app.run()
六、闪现(flash)
传递到下一个跳转页面的数据,但只想保留一次,一般使用session的flash方法
from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request app = Flask(__name__) app.secret_key ='sdfsdfsdf' @app.route('/users') def users(): # msg = request.args.get('msg','') # msg = session.get('msg') # if msg: # del session['msg'] v = get_flashed_messages() print(v) msg = '' return render_template('users.html',msg=msg) @app.route('/useradd') def user_add(): # 在数据库中添加一条数据 # 假设添加成功,在跳转到列表页面时,显示添加成功 # return redirect('/users?msg=添加成功') # session['msg'] = '添加成功' flash('添加成功') return redirect('/users') if __name__ == '__main__': app.run()
七、类似中间件
from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request app = Flask(__name__) app.secret_key ='sdfsdfsdf' @app.before_request def process_request1(): print('process_request1') @app.after_request def process_response1(response): print('process_response1') return response @app.before_request def process_request2(): print('process_request2') @app.after_request def process_response2(response): print('process_response2') return response @app.route('/index') def index(): print('index') return 'Index' @app.route('/order') def order(): print('order') return 'order' @app.route('/test') def test(): print('test') return 'test' if __name__ == '__main__': app.run()