gpt4 book ai didi

python - 在启动时创建对象并跨请求共享

转载 作者:行者123 更新时间:2023-12-04 08:00:59 29 4
gpt4 key购买 nike

我想将我的 Django 应用程序用作基于 session 的在线服务的中继,并在所有用户之间共享此 session 。为此,我配置了 python-requests session 对象。
我想在 Django 启动时初始化这个 Session 并让它永远活着。我的想法是通过允许特定请求的 View 访问 session 对象,让对我的 Django 应用程序的所有请求共享 session 对象。
flask 设置它(出于实验目的)相当容易:

from flask import Flask, render_template, request, session
from requests import Session
app = Flask(__name__)

session = Session()
session.post() # Setup Session by logging in

@app.route("/")
def use_session():
reply = session.get() # Get resource from web service
return jsonify(reply)
这里 session将在启动时创建,并且可以通过 use_session() 访问.
不过,我很难在 Django 中设置相同的设置。创建 session 的首选位置在哪里?

最佳答案

Django 中的 Flask 代码的等价物是将相同的逻辑放在 views.py 中。文件:

# yourapp/views.py
from django.http import HttpResponse
from requests import Session

session = Session()
session.post('https://httpbin.org/post') # Setup Session by logging in


def use_session(request):
reply = session.get('https://example.com') # Get resource from web service
return HttpResponse(reply.content, status=reply.status_code)

# yourproject/urls.py
from django.urls import path
from yourapp.views import use_session


urlpatterns = [
path('', use_session)
]
该对象将在您启动服务器时创建。
这种方法的一个问题是,在实际部署中,您通常会运行应用程序的多个副本(无论是 Flask 还是 Django 或任何其他框架)以避免线程阻塞,在同一台服务器上使用多个 CPU 内核或有多个服务器,每个副本最终都会有自己的 session ,这可能工作正常,但可能会出现问题。
在这种情况下,您可以通过使用 pickle 序列化它来跨多个进程共享 Python 对象1。模块并将字节数据存储在数据库中。存储数据的好地方是 Redis 或 Memcached,但也可以使用 Django 的 ORM:
# yourapp/models.py
from django.db import models


class Session(models.Model):
pickled = models.BinaryField()

# yourapp/views.py
import pickle

from django.http import HttpResponse
from requests import Session

from . import models


def use_session(request):
# Load the pickled session from the database
session_db_obj = models.Session.objects.first()

if session_db_obj:
# Un-pickle the session
session = pickle.loads(session_db_obj.pickled)
else:
# Create a new session
session = Session()
session.post('https://httpbin.org/post') # Setup Session by logging in

# Create the database object, pickle the session and save it
session_db_obj = models.Session()
session_db_obj.pickled = pickle.dumps(session)
session_db_obj.save()

reply = session.get('https://example.com') # Get resource from web service
return HttpResponse(reply.content, status=reply.status_code)

1:不是任何物体都可以可靠地腌制和解制,小心!

关于python - 在启动时创建对象并跨请求共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66470932/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com