flask02

-web框架 -从浏览器输入一个地址,发送请求,经历了哪些过程

-反向代理,正向代理
-正向代理代理客户
-反向代理代理服务器
-你用过的python中的魔法方法:https://www.cnblogs.com/liuqingzheng/articles/9949568.html#_label3
-python中对象   []放值,取值
-重写__setitem__和__getitem__这俩方法
-Django中request.POST 是个字典
-QueryDict  
-1 d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']}):对象['name']取到最后一个
-2 有一个最大特点:不能修改,一修改就报错
def index(request):
print(type(request.GET))
aa=request.GET.dict()
aa['name']='lqz'
from django.http.request import QueryDict
return HttpResponse('ok')
-你在开发中遇到的问题以及是如何解决的

-flask快速入门
-配置文件
-app.config[]
-app.config.from_object:推荐使用,可以有测试环境和上线环境(类控制)
-四件套
-路由:基于装饰器
-本质:app.add_rule_url
-参数:路径(转换器),函数内存地址,endpoint别名,defaults:默认参数,斜杠的严格模式,重定向
-CBV
-定义个类继承MethodView
get ,post,delete....
-控制请求的方法
-decorators----源码如何实现的,放在第一个位置是包在最内层的

 反向解析:url_for 转换器支持正则: -自定义转化器 from flask import Flask, views, url_for

from werkzeug.routing import BaseConverter

app = Flask(import_name=name)

class RegexConverter(BaseConverter):

""" 自定义URL匹配正则表达式 """

    def init(self, map, regex):

       super(RegexConverter, self).init(map)

       self.regex = regex

            def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
"""
return int(value)

def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
"""
val = super(RegexConverter, self).to_url(value)
return val
# 添加到flask中
# regex 是我们自定义的
app.url_map.converters['regex'] = RegexConverter
        @app.route('/index/<regex("d+"):nid>')
def index(nid):
print(type(nid))
print(url_for('index', nid='888'))
return 'Index'

if __name__ == '__main__':
app.run()
-jinga2 模板语言
-支持函数加括号并且传参
-其它的用法完全同DTL
-模板中处理:{{ss|safe}}
-视图函数中用 ss=Markup(ss)
-有没有处理xss攻击?处理了
-处理xss攻击
-html中的特殊符号
-请求响应
-request请求对象
-form,args,method   其它的了解
-response响应对象
-写cookie,写headers
obj=make_response('indexddadsaasdf')
# obj.set_cookie('lqz','xxxxxx')
# obj.delete_cookie('lqz')
#响应头
obj.headers['xxxxx']='yyyyyy'

-session
-cookie,session,token分别是什么?

-使用必须先设置一下秘钥:app.secret_key='asfdasdfasdfasdf'
-session['name']='lqz' 放值,取值session['name']
-源码执行流程
-save_session
-响应的时候,把session中的值加密序列化放到了cookie中,返回到浏览器中
-open_session
-请求来了,从cookie中取出值,反解,生成session对象,以后再视图函数中直接用session就可以了
-session.modified
-闪现
-使用
-设置值
flash('我出错了')
flash('超时错误',category="x1")
-取值:一旦取过一次,再另一个视图函数中再取就没了
get_flashed_messages()
get_flashed_messages(category_filter=['x1','x2'])
-使用场景:
-在某个位置放一个值,过会去取出来

-请求扩展
-before_request
@app.before_request
def before_request():
print('来了')
-afer_request
@app.after_request
def after_request(response):
print(type(response))
print('走了了')
return response

-*****注意:
1 执行顺序
2 如果before_request返回了,afer_request,如何走的

-before_first_request(服务一启动,第一次请求会走,以后再也不走了)
@app.before_first_request
def first():
print('我的第一次')
-teardown_request
@app.teardown_request
def ter(e):
print(e)
print('无论如何都会走,即便出了异常')
-errorhandler
@app.errorhandler(404)
def error_404(arg):
# return render_template('')
return '你迷路了'
-标签和过滤器
@app.template_glob #标签
def sb(a1, a2):
return a1 + a2
#{{sb(1,2)}}
@app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3
#{{1|db(2,3)}}
-中间件(跟django中的中间件不一样)
-flask中一旦请求到来,要执行app()---->执行的是app.__call__,整个flask的入口
-代码实现(了解)
from flask import Flask,session,url_for,redirect,request,flash,get_flashed_messages,render_template
app = Flask(__name__)
class MyMiddleWare():
def __init__(self,my_wsgi_app):
self.wsgi_app=my_wsgi_app
def __call__(self, environ, start_response):
print('之前执行一些东西')
obj=self.wsgi_app(environ, start_response)
print('之后执行一些东西')
return obj
@app.route('/',methods=['GET','POST'])
def index():
return 'ok'
if __name__ == '__main__':
app.__call__
# app.run()
app.wsgi_app = MyMiddleWare(app.wsgi_app)
app.run()
#请求来了,执行app.__call__本质执行的是:self.wsgi_app(environ, start_response),app.wsgi_app(environ, start_response),
# 会调到自己写的类的__call__方法

-蓝图
-分文件,分目录

-使用蓝图划分文件目录
0 生成蓝图对象
admin = Blueprint(
'admin',
__name__,
template_folder='templates',
static_folder='static'
)
1 注册蓝图
-url_prefix访问路由的前缀
app.register_blueprint(admin, url_prefix='/admin')
3 使用(只在当前蓝图下有效)
-注册路由
@admin.route('/index')
-请求扩展相关
@admin.before_request
-请求上下文
-request对象
-对象() 会执行对象的__call__
-每当来一个请求,就会执行app.__call__()

 

补充:
-中间件:
-中间件是一个很大的概念
-web中间件
-数据库中间件
-消息队列中间件

 

-flask整个源码:
ctx = self.request_context(environ)
  error = None
  try:
      try:
          ctx.push()
#根据路径去执行视图函数、视图类
          response = self.full_dispatch_request()
      except Exception as e:
          error = e
          response = self.handle_exception(e)
      except: # noqa: B001
          error = sys.exc_info()[1]
          raise
      return response(environ, start_response)
  finally:
#不管出不出异常,都会走这
      if self.should_ignore_error(error):
          error = None
      ctx.auto_pop(error)

 

原文地址:https://www.cnblogs.com/tangda/p/11203117.html