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 ...
随机推荐
- Mysql 链接数据库时区错误
错误信息:Error querying database. Cause: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ ...
- spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)
本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...
- pandas向左移动非空单元格
碰到个小问题, 因为需要更改excel 的行为. 处理最多的还是excel的事, 不过看起来是excel.实际上对pandas 的库的熟悉.读取,更改,应用等等,方法. 十分有用. 先说需求,本来的表 ...
- vue全局自定义指令-元素拖拽
小白我用的是vue-cli的全家桶,在标签中加入v-drap则实现元素拖拽, 全局指令我是写在main.js中 Vue.directive('drag', { inserted: function ( ...
- Entity Framework Code First (五)Fluent API - 配置关系 转载 https://www.cnblogs.com/panchunting/p/entity-framework-code-first-fluent-api-configuring-relationships.html
上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...
- vscode左侧文件不同颜色标识含义
代码里的左侧颜色标识: 红色,未加入版本控制; (刚clone到本地)绿色,已经加入版本控制暂未提交; (新增部分)蓝色,加入版本控制,已提交,有改动: (修改部分)白色,加入版本控制,已提交,无改动 ...
- rsync+sersync实现文件同步
一.目的 A服务器:11.11.11.11 源服务器 B服务器:22.22.22.22 目标服务器,既同步备份的目标 将A服务器的文件同步到B服务器上 二.rsync环境部署 1.关闭selinux, ...
- 用递归方法求n!
题目: 编写一个程序,输入n,求n!(用递归的方式实现). public class test { public static long fac(int n){ if(n<0){ return ...
- Learning OSG programing---osgAnimation(1)
osg::AnimationPath* createAnimationPath(const osg::Vec3& center,float radius,double looptime) { ...
- jmeter 添加header
接口说明文档: article.fetch(通用转码服务) 通用转码服务,获取任意 url 的正文以及 title 等基本信息,仅支持 post 方法请求. 参数 参数 类型 是否必须 示例 其它说明 ...