python Flask web框架
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python Flask web框架,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11111字,纯文字阅读大概需要16分钟。
内容图文
![python Flask web框架](/upload/InfoBanner/zyjiaocheng/839/b4225e2477244361a01052c7d3947f3c.jpg)
目录:
--> Flask
--> 配置文件
--> 配置文件解析
--> 配置文件导入
--> 路由
--> 路由参数
--> 常用路由匹配
--> 请求相关 & 响应
--> request 参数
--> response 参数
--> 打包模板和参数
--> 模板 jinja2
--> 模板导入/继承
--> 前段/后端 安全渲染
--> 前段自定义函数 macro
--> 后端自定义前段函数
--> @app.template_global()
--> @app.template_filter()
--> 请求扩展
--> @app.before_first_request
--> @app.before_request
--> @app.after_request
--> 错误页面自定制
--> 闪现
--> 蓝图
--> 中间件
--> 信号
--> 上下文管理
--> threading.local
--> 请求上下文(requestContext)
--> request
--> session
--> 应用上下文:AppContext
--> app(current_app)
--> g
--> 实现细节
--> 利用threading.local 的线程 唯一ID标识符
--> requestcontext对象通过localstack添加到Local 栈中
--> 导入request(session、current_app、g)是localproxy -> 偏函数 ->Localstack -> Local
--> requestcontext的auto_pop -> localstaack.pop ->local中移除
--> 多app应用
--> 技术点:LocalProxy、chain,偏函数
--> 中间件/信号 执行顺序
falsk 配置文件解析
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
{ 'DEBUG': get_debug_flag(default=False), 是否开启Debug模式 'TESTING': False, 是否开启测试模式 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': timedelta(days=31), 'USE_X_SENDFILE': False, 'LOGGER_NAME': None, 'LOGGER_HANDLER_POLICY': 'always', 'SERVER_NAME': None, 'APPLICATION_ROOT': None, '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, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), 'TRAP_BAD_REQUEST_ERRORS': False, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': True, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, }View Code
falsk 配置文件导入:
# flask 配置文件介绍: # 方式一: # Session, Cookies以及一些第三方扩展都会用到SECRET_KEY值 # app.config['SECRET_KEY'] = '123456' # app.config['DEBUG'] = True # 方式二:(只有部分可以如此操作) # app.secret_key = '123456' # 方式三:(导入配置文件的方式) # app.config.from_pyfile('setting.py') # 方式四:(推荐方式:在配置文件中写一个类,将配置写在类里面,再导入) app.config.from_object('setting.Text')
方式四 setting文件
# 共有的 class Config(object): SECRET_KEY = '123456' DEBUG = False class Text(Config): DEBUG = True SECRET_KEY = 'abcd'
路由参数
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# 路由系统: # 基于装饰器来实现,但是究其本质是通过下面函数实现的 # app.add_url_rule(rule='/路径',endpoint='别名',view_func='视图函数',methods='访问的类型/["GET","POST"]') # CBV 的flask 方式: # from flask import views # 配置视图 # class Text(views.MethodView): # methods = ['GET','POST'] # # 登录装饰器 # # decorators = [login_required,] # # def get(self): # return 'Text_Class_get' # # def post(self): # return 'Text_Class,post' # # 配置路由 # app.add_url_rule(rule='/text/',view_func=Text.as_view(name='text')) # app.add_url_rule 和 app.route # 参数: # rule: url 规则 # view_func 视图函数名称 # defaults=None 默认值,当url中没有参数 # endpoint=None 反向生成url,不能重名,在使用装饰器时,没有导入@wraps(func)则需要区分 # methods=None 允许的请求方式,如:['GET','POST'] # strict_slashes=None 对URL最后的 / 符号是否严格要求 # redirect_to=None 重定向地址 # subdomain=None 子域名访问,需要配合域名使用View Code
常用路由匹配方式
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# 常用路由方式: # @app.route('/user/<username>') # @app.route('/user/<int:post_id>') # @app.route('/user/<float:post_id>') # @app.route('/user/<path:PATH>') # @app.route('/user/',methods=['GET','POST'])View Code
请求相关 & 响应
request
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# request # request.method # request.args # request.form # request.values # request.cookies # request.headers # request.path # request.full_path # request.script_root # request.url # request.base_url # request.url_root # request.host_url # request.host # request.files # obj = request=files['the_file_name'] # obj.save('/var/www/uploads'+secure_filename(f.filename))View Code
response
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# response # return "字符串" # render_templates('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 responseView Code
模板 jinja2
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# 模板:(模板也支持导入,继承) # 跟 django 都是使用的jinja2 模板 # 前段 安全渲染 {func | safe } # 后端 安全渲染 import Markup 函数 # # 新增功能 # {% macro 自定义函数名(参数,参数N) %} # <span>{{参数}}---{{参数n}}</span> # <span>{{参数}}---{{参数n}}</span> # <span>{{参数}}---{{参数n}}</span> # {% endmacro%} # # # 调用上面的函数 # {{自定义函数(参数)}} # ------------ # 模板内自定义函数(类似django simple_tag) # @app.template_global() # def sb(a1,a2): # return a1 + a2 # 模板中使用方法: # {{sb(1,2)}} # ------------ # 后端自定义前段函数 # @app.template_filter() # def sb2(a1,a2,a3): # return a1 + a2 + a3 # 模板中使用方法: # {{1|sb2(2,3)}}View Code
请求扩展
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# 请求扩展 (django中的中间件) # 第一次访问执行: # @app.before_first_request # def first(*args,**kwargs) # pass # # 先进后出 # @app.before_request # def preocess_request(*args,**kwargs): # # 这里可以做登录认证 # print('request_1') # # @app.before_request # def preocess_request2(*args,**kwargs): # # 这里可以做登录认证 # print('request_2') # # @app.after_request # def preocess_response(response): # print('response_1') # return response # # @app.after_request # def preocess_response2(response): # print('response_2') # return responseView Code
错误页面自定制
# # 错误页面 自定制 # # @app.errorhandler(404) # def error_404(arg): # return "页面不存在!"
闪现
# # 闪现 : 临时数据操作 如:显示错误信息 # from flask import flash,get_flashed_messages # # @app.route('/get') # def get(): # data = get_flashed_messages() # # data = get_flashed_messages(category_filter=['l1']) 分类取数据 # print(data) # return "get" # # @app.route('/set') # def set(): # flash('aaaaaa') # # flash('aaaaaa',category='l1') #可以数据分类 # return "set"
上下文管理
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# 上下文管理: # 1.知道flask 依赖的组件: WSGI、jinja2、Werkzeug,flask 框架是组装件的粘合剂 # client --- wsgi -----flask --- jinja2 ----werkzeug # 2.flask 用threading.local 做了一个Local对象 存放请求信息 # 引入步骤: # Flask()实例化 -> 将请求数据传入Flask实例 -> 将数据push 至 _request_ctx_stack,_request_ctx_stack实质是 LocalStack() # LocalStack() 初始化时 又实例化了 Local() ,local初始化 最终以类似列表的方式 保存object.__setattr__(self, '__storage__', {}) # 请求到来: # --ctx = 封装requestContext(request,ssision) # --ctx放进Local中 # 执行视图时 # --导入request # --request ---> LocalProxy对象中 __getattr__获取对应的请求 # ---调用 _lookup_req_object函数:去local 中酱requestcontext 将获取到,再去requestcontext中获取request或session # 请求结束 # --ctx.auto_pop() # --ctx从local中移除 # --> 上下文管理 # --> threading.local # --> 请求上下文(requestContext) # --> request # --> session # --> 应用上下文: AppContext # --> app(current_app) # --> g # --> 实现细节 # --> 利用threading.local的线程唯一ID标识符 # --> requestcontext对象通过localstack添加到Local栈中 # --> 导入request(session、current_app、g)是localproxy -> 偏函数 ->Localstack -> Local # --> requestcontext的auto_pop -> localstaack.pop ->local中移除View Code
多APP 应用
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# 多APP 应用 # web 访问多app应用时,上下文管理是如何实现的? # from werkzeug.wsgi import DispatcherMiddleware # from werkzeug.serving import run_simple # # app01 = Flask('app01') # app02 = Flask('app02') # # @app01.route('/index') # def app01_index(): # return "app01" # # @app02.route('/index') # def app02_index(): # return "app02" # # app = DispatcherMiddleware(app01,{ # '/app02前缀':app02, # }) # # if __name__=="__main__": # run_simple('localhost',8002,app)View Code
session 相关
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 使用session 前 必须配置SECRET_KEY!!! # session 操作:(session就相当于是一个字典!) # session['类型'] = 值 # session.pop['类型'] # del session['类型'] #&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
session 第三方组件(自定制session保存位置)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200808.jpg)
![python Flask web框架 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506063200844.jpg)
# flask session 机制 ''' ->请求刚进来:获取随机字符串,存在,则去容器 中获取原来的个人数据,否则创建一个空的容器 ->对象(随机字符串,{请求数据}) ->视图:读取内存中对象 ->响应:内存对象 将对象数据保存到数据库(没有指定数据库的话 保存在内存中),把随机字符串写到用户cookie中 ''' # 使用 方式一 # flask-session 组件 # from flask_session import Session # import pymongo # # app.config['SESSION_TYPE'] = 'mongodb' # session类型为redis # # app.config['SESSION_MONGODB'] = pymongo.MongoClient('localhost',27017) # app.config['SESSION_MONGODB_DB'] = 'text' # app.config['SESSION_MONGODB_COLLECT'] = 'col' # # app.config['SESSION_PERMANENT'] = True # 如果设置为True,则关闭浏览器session就失效。 # app.config['SESSION_USE_SIGNER'] = False # 是否对发送到浏览器上session的cookie值进行加密 # app.config['SESSION_KEY_PREFIX'] = 'session:' # 保存到session中的值的前缀 # # Session(app) # 使用 方式二 # from flask_session import MongoDBSessionInterface # app.session_interface = MongoDBSessionInterface("参数!")View Code
一些问答
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 问题1 多线程时如何体现的? # 问题2 flask的local 中保存数据时,使用列表创建出来的栈,为什么用栈? # --如果写web程序,web运行环境,栈中永远保存1条数据(可以不用栈) # --写脚本获取app信息,可能存在app上下文嵌套关系 ''' from flask import Flask,current_app,globals,_app_ctx_stack app1=Flask('app01') app1.debug = False app2=Flask('app02') app2.debug = False with app1.app_context(): print(_app_ctx_stack._local.__storage__) print(current_app.config['DEBUG']) with app2.app_context(): print(_app_ctx_stack._local.__storage__) print(current_app.config['DEBUG']) ''' # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
flask 实现装饰器方式:引入(wraps)
# flask 实现登录装饰器的功能 def login_required(func): @wraps(func) # @wraps(view_func)的作用: 不改变使用装饰器原有函数的结构(如__name__, __doc__) # 不使用wraps可能出现的ERROR: view_func...endpoint...map... def wrapper(*args,**kwargs): if session.get('user'): return func(*args,**kwargs) else: return redirect('/') return wrapper # 装饰器实现的方式: @app.route('/index/',methods=['GET']) @login_required # flask 登录装饰器 def index(): return render_template('index.html',u_list=data) @app.route("/detail/<int:id>",methods=['GET']) def detail(id): return str(id)
内容总结
以上是互联网集市为您收集整理的python Flask web框架全部内容,希望文章能够帮你解决python Flask web框架所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。