python - Django:服务器启动时创建对象并在 View 中使用它

标签 python django

我有一个图像检测器模块,加载大约需要一分钟。我想在服务器启动时实例化它一次,并在 View 中使用它。我知道当服务器从 urls.py 启动时我可以运行代码,因此,我尝试了以下操作:

url.py

from django.contrib import admin
from django.urls import include, path

from module import Module

urlpatterns = [
    path('module/', include('project.urls')),
    path('admin/', admin.site.urls),
]

module = Module()

View .py

from django.http import HttpResponse
from project.urls import module


def end_point(request):
    module.do_stuff()
    return HttpResponse("It works!")

这种方法不起作用,因为我无法从此文件导入任何变量。除此之外,如果urls.py死了,我会得到NameError:name'module'未定义。我不使用数据库,我只想要我的模块的 REST API。我想使用 Djongo,因为我将在项目的其他服务中使用它。

总结:我想要一个在服务器启动时实例化对象的地方,并且能够在 View 中使用我的对象。

谢谢!

最佳答案

这在使用它的特定应用程序的 models.py 中效果最好。但在开发过程中,这个

# my_app/models.py
import os
mymodule = {'a': 1}
print('id: {} -- pid: {}'.format(id(mymodule), os.getpid())) 

将打印出具有两个不同pid的两行。也就是说,因为在开发过程中,Django 使用第一个进程来实现自动重新加载功能。要禁用该功能,请使用以下命令关闭自动重新加载:./manage.py runserver --noreload

现在你可以做到

# my_app/views.py
import os
from django.http import HttpResponse

from .models import mymodule                                    

def home(request):
    return HttpResponse('id: {} -- pid: {}'.format(id(mymodule), os.getpid()))

它将为 mymodule 对象打印相同的 pid 和相同的 id

关于python - Django:服务器启动时创建对象并在 View 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51249178/

相关文章:

python - 如何在seaborn中绘制带有一天x标签的时间序列?

python - 在子图中写入文本

python - 如何解决这个 django OneToOneField 模型错误?

mysql - 如何在 Django 中查询时减少数据库命中次数

django - 使用Haystack设置Elasticsearch

django - 有没有办法覆盖 ModelAdmin 中的 delete_selected 方法但保持确认?

python - 使用 shutil.make_archive() 创建存档同时排除某些路径

python - 计算 Pandas 数据框中的年数

python - Tornado 中的长轮询是如何工作的?

django - 如何序列化 drf 中的 Hstore 字段