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)
flask02的更多相关文章
- Flask02 路由的书写、蓝图、利用蓝图实现url前缀、利用蓝图实现子域名、访问静态文件
1 书写路由的两种方法 1.1 利用Flask实例对象的 add_url_rule 方法实现 该方法有一个必填参数,两个默认参数 · rule : 请求路径的规则 endpoint : 端点,默认值是 ...
- Flask学习 2修改路由规则 传入参数访问url
#!/usr/bin/env python # encoding: utf-8 """ @version: v1.0 @author: cxa @file: flask0 ...
随机推荐
- php 标准库之ArrayObject
以下为ArrayObject的常用函数: ArrayIterator::current( void ) //返回当前数组元素 ArrayIterator::key(void) //返回当前数组key ...
- HDU 5179 beautiful number (数位dp / 暴力打表 / dfs)
beautiful number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- fread fwrite文本模式读写回车换行符 自动转换问题
fread 会把\r\n(0d0a)替换为\nfwrite 会把\n替换为\r\n(0d0a),\r\n会变成\r\r\n(0d0d0a) 今天在写一个日志类,用于打印服务程序的信息. 我将每一个日 ...
- Python的Django框架中的URL配置与松耦合
Python的Django框架中的URL配置与松耦合 用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比 ...
- HTML--JS 多列求和
<html> <head> <title>多列求和</title> <script type="text/javascript" ...
- c++函数overload 的歧义匹配
https://www.zhihu.com/question/20200615 函数重载选择最佳匹配函数涉及到类型转换,默认参数 注意:没有int f(int,int)版本,编译器认为上面两个函数都是 ...
- 操作系统 - Linux命令整理 - Ubuntu
镜像 http://mirrors.163.com/ubuntu-releases/ 系统相关 Ubuntu14.04相关 安装 - VMware Install Ubuntu Continue In ...
- python datetime模块的strftime()
strftime() 可以对datetime对象进行格式化,生成需要时间格式的时间 strptime() 可以对格式化后的时间再生成datetime对象 格式化时间时,如果不想要-来隔开,还可以 ...
- Array.prototype.includes
if (!Array.prototype.includes) { Array.prototype.includes = function(searchElement /*, fromIndex*/ ...
- 【洛谷UVA307】小木棍Sticks
小木棍Sticks[传送门] 算法的话:dfs+超强剪枝: (另外注意UVA上好像不接受万能头[因为万能头WA了两次,瑟瑟发抖]) 思路: 最直接的思路,枚举木棍长度来dfs,但这样很容易就TLE了. ...