Django:服务器启动时创建对象并在视图中使用它

时间:2018-07-09 15:33:59

标签: python django

我有一个图像检测器模块,加载大约需要一分钟。我想在服务器启动时实例化一次,并在视图中使用它。我知道当服务器从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,因为我将在项目的其他服务中使用它。

总结:服务器启动时,我希望有一个实例化对象的地方,并且能够在视图中使用我的对象。

谢谢!

1 个答案:

答案 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