我有一个图像检测器模块,加载大约需要一分钟。我想在服务器启动时实例化一次,并在视图中使用它。我知道当服务器从urls.py
启动时我可以运行代码,因此,我尝试了以下操作:
urls.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()
views.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' is not defined
。我不使用数据库,我只想对模块使用REST API。我想使用Djongo,因为我将在项目的其他服务中使用它。
总结:服务器启动时,我希望有一个实例化对象的地方,并且能够在视图中使用我的对象。
谢谢!
答案 0 :(得分:0)
在使用它的特定应用程序的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()))
,它将为pid
对象打印相同的id
和相同的mymodule
。