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 ...
随机推荐
- flask-script实现自动刷新页面调试
本文flask==1.0.2 1.导入extension包 from flask_script import Manager 2.使用manager管理工具 app = Flask(__name__) ...
- 138、Tensorflow serving 实现模型的部署
将Tensorflow模型部署成Restful接口 下面是实现过程,整个操作都是在Linux上面实现的,因为Tensorflow Serving 目前还只支持Linux 这个意义真的是革命性的,因为从 ...
- day32—CSS多列布局学习
转行学开发,代码100天——2018-04-17 关于多列布局,前期已经梳理过,今天的培训课程学习中再次提及,趁此也做个总结和检验. 多列布局的介绍参考: day08—css布局解决方案之多列布局 ...
- 机器学习实战笔记-2-kNN近邻算法
# k-近邻算法(kNN) 本质是(提取样本集中特征最相似数据(最近邻)的k个分类标签). K-近邻算法的优缺点 例 优点:精度高,对异常值不敏感,无数据输入假定: 缺点:计算复杂度高,空间复杂度高: ...
- Mac010--IDEA安装及应用
Mac--IDEA安装及应用 应用IDEA,首先确保已安装如下环境: JDK:JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库(安装 & 配置环境变 ...
- IDF-CTF-图片里的英语 writeup
题目链接:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=34 一恒河沙中有三千世界,一张图里也可以有很多东西. ...
- 自动发现项目中的url
def check_url_exclude(url): """ 判断url是否需要自动被发现,如果不是则移除 :param url: 自动发现的url :return: ...
- 《JAVA设计模式》之适配器模式(Adapter)
在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...
- Cannot modify header information - headers already sent by出错的原因
<?php ob_start(); setcookie("username","送家",time()+3600); echo "the user ...
- Day7-----Python的序列类(有子类:元组类,列表类)
序列类型 1.基本介绍: 序列类型是一种基类类型 ,既然被称为那就肯定是有道理的,关于序列 它有 正向 和 反向 两种序号,正向序号从零开始,反向序号从负一开始 a = '例如这个字符串' ...