首页 > 其他分享 >请求与响应、session的使用、闪现、蓝图

请求与响应、session的使用、闪现、蓝图

时间:2022-12-12 21:59:03浏览次数:52  
标签:闪现 app 蓝图 request session cookie print self

请求与响应

请求对象

# 请求对象,是全局的,需要导入,这个全局的request,在哪个视图函数中,就是当次的request对象,不会乱
1 request.method  提交的方法
print(request.method)

2 request.args  get请求提及的数据
print(request.args)
print(request.args.get('name'))

3 request.form   post请求提交的数据
print(request.form)

4 request.values  post和get提交的数据总和
print(request.values)

5 request.cookies  客户端所带的cookie
print(request.cookies)

6 request.headers  请求头
print(request.headers)
print('------')

7 request.path     不带域名,请求路径
print(request.path)

8 request.full_path  	不带域名,带参数的请求路径
print(request.full_path)

9 request.script_root
print('服务端:', request.script_root)

10 request.url       带域名带参数的请求路径
print(request.url)
11 request.base_url		带域名请求路径
print(request.base_url)

12 request.url_root      域名
print(request.url_root)

13 request.host_url		域名
print(request.host_url)

14 request.host			127.0.0.1:500
print(request.host)

15 request.files	文件
print(request.files)
# obj = request.files['files']
# obj.save('./xx.jpg')

16 request.data		django的body
print(request.data)

响应对象

from flask import make_response

@app.route('/',methods=['GET','POST'])
def index():
    # 1四件套
        # -render_template
        # -redirect
        # -jsonify
        # -''
    # 2写入响应头
    # from .wrappers import Response
    # 没有响应对象,先做出一个响应对象
    res='helloe'
    res=make_response(res)
    # 往Response的对象中,放入响应头
    res.headers['name']='lqz'
    # 3 写入cookie
    # res.set_cookie('xx','xx')
    res.delete_cookie('xx')
    '''
    key, 键
    value=’’, 值
    max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止
    expires=None, 超时时间(IE requires expires, so set it if hasn’t been already.)
    path=’/‘, Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
    domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如, domain=”.example.com”所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只能由设置它的站点读取
    secure=False, 浏览器将通过HTTPS来回传cookie
    httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    '''
    return res

前后端分离和混合

1.前后端混合,cookie 是后端写入的
1.1res.set_cookie('xx','xx') 混合都是这么写的,这样写了,浏览就会把cookie保存到cookie中
1.2本质是后端把cookie放到响应头中,浏览器读到响应头中有cookie,把cookie写入到浏览器中

2.前后端分离后,cookie 是
2.1直接把客户端要存的cookie中的数据,放到响应体中
2.2前端(浏览器,app,小程序),自己取出来,放到相应的位置
-浏览器使用js自己写入到cookie
-app 自己使用代码写入到某个位置

session的使用和原理

1.存值-在视图函数中
def index():
    session['name'] = 'aaa'

2.取值-在视图函数中
def text():
    print(session['name'])

源码分析

1.django 的这一套,都在 from django.contrib.sessions.middleware import SessionMiddleware

2. flask 在flask源码中
	-请求来了,会执行 app()
2.1整个flask,从请求进来,到请求走的整个流程
    def wsgi_app(self, environ, start_response):
        ctx = self.request_context(environ)
        try:
            try:
                ctx.push() # 它的源码
                response = self.full_dispatch_request()
            except Exception as e:
                error = e
                response = self.handle_exception(e)
            except: 
                error = sys.exc_info()[1]
                raise
            return response(environ, start_response)
        finally:
            ctx.pop(error)

2.2ctx.push 的 373行左右	
if self.session is None:
    session_interface = self.app.session_interface
    self.session = session_interface.open_session(self.app, self.request)
    if self.session is None:
        self.session = session_interface.make_null_session(self.app)
                
2.3app.session_interface  就是Flask对象中有个session_interface对象SecureCookieSessionInterface()
-open_session:请求来了,从cookie中取出三段串,反序列化解密放到session中
-save_session:请求走了,把session字典中的值,序列化加密,放到cookie中

2.4 open_session:请求来了执行
    def open_session(self, app, request) :
        s = self.get_signing_serializer(app)
        if s is None:
            return None
        # val 就是取出的三段:eyJhZ2UiOiIxOSIsIm5hbWUiOiJscXoifQ.Y5ac9g.vOomQFqFuaqXWqRQhvSNyc61UIk
        val = request.cookies.get('session')
        if not val:
            return self.session_class()
        max_age = int(app.permanent_session_lifetime.total_seconds())
        try:
            data = s.loads(val, max_age=max_age)
            return self.session_class(data)
        except BadSignature:
            return self.session_class()

2.5 请求走了,执行save_session
	 def save_session(self, app, session, response):
        name = self.get_cookie_name(app)
        domain = self.get_cookie_domain(app)
        path = self.get_cookie_path(app)
        secure = self.get_cookie_secure(app)
        samesite = self.get_cookie_samesite(app)
        httponly = self.get_cookie_httponly(app)

        if not session:  # 如果视图函数放了,不为空 session['name']='lqz'
            if session.modified:  # 
                response.delete_cookie(
                    name,
                    domain=domain,
                    path=path,
                    secure=secure,
                    samesite=samesite,
                    httponly=httponly,
                )

            return

  
        if session.accessed:
            response.vary.add("Cookie")

        if not self.should_set_cookie(app, session):
            return

        expires = self.get_expiration_time(app, session)
        # 序列化---》加密了
        val = self.get_signing_serializer(app).dumps(dict(session))  # type: ignore
        # 三段:
        response.set_cookie(
            name, # session
            val,  # 三段:
            expires=expires,
            httponly=httponly,
            domain=domain,
            path=path,
            secure=secure,
            samesite=samesite,
        )

     
3.6session的执行流程
	1 请求来的时候,会执行open_session--->取出cookie,判断是否为空,如果不为空,把它反序列化,解密---》字典---》转到session对象中----》视图函数
    
    2 请求走的时候,会执行save_session---->把session转成字典----》序列化加密--》三段---》放到cookie中

闪现

1.在某个请求中放入值,另一个请求中取出,取出来后就没了
-需求:访问a页面,出了错,重定向到了b页面,要在b页面线上a页面的错误信息

2.使用
@app.route('/', methods=['GET'])
def index():
    # session['name'] = 'aaa'
    # 取出错误信息
    errors = get_flashed_messages(category_filter=['errors'])[0]
    return render_template('index.html', errors=errors)

@app.route('/goods', methods=['GET'])
def goods():
    if session.get('name'):
        return 'goods'
    else:
        # 设置错误信息
        flash('没有登录', category='errors')
        return redirect('/')

补充异步

1.异步框架 FastAPi
async def index():
    print('abaxskdl')
    a++
    await xxx  # io操作
# 框架之前的web框架,开启进程,线程---》一条线程会运行多个协程函数----》协程函数中遇到io,读到await关键字,就会切换到别的协程函数

2.一旦使用了异步,所有的模块,都要是异步
-pymysql:同步的
-redis:同步
-aiomysql:异步
-aioredis:异步
2.1在fastapi或sanic中,要操作mysql,redis要使用异步的框架,否则效率更低
-django 3.x 以后页支持async 关键字
-没有一个特别好异步的orm框架
sqlalchemy、tortoise-orm
-https://tortoise-orm.readthedocs.io/en/latest/index.html

3aiomysql
import asyncio
import aiomysql

loop = asyncio.get_event_loop()

async def test_example():
    conn = await aiomysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='mysql',loop=loop)
    cur = await conn.cursor()
    await cur.execute("SELECT Host,User FROM user")
    print(cur.description)
    r = await cur.fetchall()
    print(r)
    await cur.close()
    conn.close()

loop.run_until_complete(test_example())

4. aioredis
import aioredis
import asyncio
class Redis:
    _redis = None
    async def get_redis_pool(self, *args, **kwargs):
        if not self._redis:
            self._redis = await aioredis.create_redis_pool(*args, **kwargs)
        return self._redis

    async def close(self):
        if self._redis:
            self._redis.close()
            await self._redis.wait_closed()

async def get_value(key):
    redis = Redis()
    r = await redis.get_redis_pool(('127.0.0.1', 6379), db=7, encoding='utf-8')
    value = await r.get(key)
    print(f'{key!r}: {value!r}')
    await redis.close()         

if __name__ == '__main__':
    asyncio.run(get_value('key'))  # need python3.7

请求扩展

1.before_request
-在请求进视图函数之前执行,如果有多个的话,会从上往下,依次执行
-如果返回四件套之一,就直接返回了,在这里面,正常使用request对象
@app.before_request
def before():
    print('请求进视图函数前执行')

2.after_request
-在请求从视图函数走之后执行,如果有多个的话,会从下往上,依次执行
-要有参数,和返回值,参数就是response对象,返回值也必须是resposne对象
-session,request 照常使用
@app.after_request
def after(response):
    print('请求从视图函数走后执行')
    return response

3.before_first_request
-项目启动后,第一次访问会执行,以后再也不执行了
@app.before_first_request
def first():
    print('第一次访问时执行')

4.teardown_request
-每一个请求之后绑定一个函数,即使遇到了异常,每个请求都会继续运行,记录错误日志
@app.teardown_request
def tear_down(e):
    print(e)  # 如果有异常,这是异常对象
    print('我执行了')

5.errorhandler()
-当出现指定状态码时会执行(路径不存在时404,服务器内部错误500)
@app.errorhandler(404)
def error_404(arg):
    print('404会执行')
    return "404错误了"

6.template_global()
-标签 ,在模板中用 {{sb(2,4)}}
@app.template_global()
def sb(a1, a2):
    return a1 + a2

7.template_filter()
-在模板中用 {{10|db(1,2)}}
@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3

蓝图

1.蓝图(blueprint)
蓝图就是为了划分目录的

2.不用蓝图划分目录
flask  # 项目名
static  # 静态文件存放位置
templates   # 模板存放位置
	user.html  # 用户html页面
views    # 视图函数的py文件
	__init__.py  # 里面定义了Flask的app对象
	goods.py    # 商品相关视图
	user.py    # 用户相关视图
app.py        #启动文件

3.蓝图小型项目
flask_little  # 项目名
	-src            # 项目代码所在路径
    	-__init__.py   # app对象创建的地方
    	-templates     # 模板
        	-user.html
		-static       # 静态文件
        -views        # 视图函数存放位置
        	-user.py  # 用户相关视图
        	-order.py  # 订单相关视图
	-manage.py  # 启动文件
-
3.1init.py
from flask import  Flask
app=Flask(__name__)
from flask_test.views import user
from flask_test.views import order
app.register_blueprint(user.us)
app.register_blueprint(order.ord)
3.2manage.py
from flask_test import  app
if __name__ == '__main__':
    app.run(port=8008)
3.3user.py
from flask import Blueprint
us=Blueprint('user',__name__)
@us.route('/login')
def login():
    return 'login'

4.大型项目
flask_big   # 项目名字
	-src   # 项目代码所在位置
    	-__init__.py  # src的init,falsk,app实例化
        -settings.py  # 配置文件
    	-admin       # 类似于django的admin app
        	-__init__.py  # 蓝图初始化
        	-template   # 模板
            	-backend.html
            -static   # 静态文件
            	-xx.jpg
            -views.py  # 视图层
            -models.py  # models层,后期咱们表模型
        -api
        	-__init__.py
            -template
			-static
			-models.py
            -views.py
	-manage.py  # 启动文件

标签:闪现,app,蓝图,request,session,cookie,print,self
From: https://www.cnblogs.com/riuqi/p/16977193.html

相关文章

  • Cookie与Session
    目录Cookie与Session1、Django操作cookie简单实现用户登录加入装饰器2、Django操作session设置session获取session过期时间清除sessionCookie与SessionHTTP被设计为”⽆......
  • 【UEBP】虚幻蓝图基础
    一.虚幻引擎安装与源码获取1.1虚幻引擎安装打开www.unrealengine.com网站,点击登录→注册虚幻引擎免费使用,如果想要使用Launcher(登录器)必须注册Epic帐号Epic帐号也是......
  • JavaWeb对于Listener的运用详解【利用Session统计在线人数】
    一.监听器Listener1.1Listener的作用Listener是一个功能组件,在创建、销毁或添加、修改或删除应用程序、会话和请求对象的属性时自动执行代码。监听器是servlet的监听器,......
  • JSP改造Cookie案例以及Session的快速入门
    JSP改造Cookie案例以及Session的快速入门<%@pageimport="java.util.Date"%><%@pageimport="java.text.SimpleDateFormat"%><%@pageimport="java.net.URLEncode......
  • cookie&session使用方式
    cookie:数据存在客户端(浏览器),长期储存session:数据存在服务器,默认保存30分钟cookie使用方式:  1.创建cookie对象并用response发送Cookiecookie=newCookie("us......
  • Django只session
    1.session流程2.添加sessiondefindex(request):#添加sessionrequest.session["set_session"]="defaulit001"returnHttpResponse("测试效能")设置s......
  • flask蓝图与项目一般结构
    flask一般项目结构初始化配置flask项目时,路由和视图是放在启动文件里的,这样不太方便我们后期的整理和查阅!因此,我们需要将项目启动文件和路由视图分开处理!在项目文件下......
  • 判断session 方法
    一.在每个页面的page_load()方法中判断If(Session[“UserId”]!=null){//登陆成功的情况}Else{//response.write(“<script>alter(‘请登陆’);</script>”);}//这......
  • Message: session not created: This version of Chromedriver only supports Chrome
    Sessionnotcreatedexception:Message:sessionnotcreated:ThisversionofChromedriveronlysupportsChromeversion88Currentbrowserversionis90.0.4430.85wi......
  • ASP.NET Core缓存Redis最佳实践+分布式Session+单点登录(SSO)
    《ASP.NETCore分布式缓存RedisLock分布锁最佳实践》1、JMeter模拟高并发工具简单入门使用2、redis分布式锁介绍3、高并发扣减库存带来的问题与思考4、netcore基于StackE......