【问题标题】:Django: create object when server starts and use it in viewsDjango:在服务器启动时创建对象并在视图中使用它
【发布时间】:2018-07-09 15:33:58
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 这不是重复的,但可能会引起您的兴趣。 stackoverflow.com/a/51082877/7692463。 AKA 你可以使用信号。查看我的实现。
  • 我很确定你应该在你的 manage.py 上使用它,当他第一次使用 manage.py runserver 启动服务器时,他将启动你的模块,但你必须在整个应用程序中访问

标签: python django


【解决方案1】:

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

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

将打印出两行带有两个不同的pids。也就是说,因为在开发过程中,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对象打印相同的pidid

【讨论】:

  • 这正是我所需要的!谢谢。现在唯一的问题是 django 运行了 models.py 的两倍。我的模块消耗了很多内存,所以,加载它两次几乎会破坏我的电脑。
  • 只需使用./manage.py runserver --noreload 禁用自动重新加载功能。
  • 太完美了!谢谢@C14L。
猜你喜欢
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2018-07-01
  • 2021-06-27
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多