我有一些服务器启动代码位于我的一个Django应用程序的“models.py”中。我需要在服务器启动时运行该代码。
问题是,该代码发出SQL查询,这阻止我使用syncdb
运行psycopg2
(它会中断事务,并且不会创建表。)
将代码放在中间件中并提升django.core.exceptions.MiddlewareNotUsed
并不是最理想的,因为我也希望在Django shell中产生效果(并且将初始化代码放在中间件中听起来也不正确。)另外我需要等待第一个请求。我想在服务器启动时运行代码,而不是在第一个客户敲响我的网站时。
Django中仍未实现服务器启动信号,因此这不是一个选项。
因此,我想以某种方式:
我在任何文档中都找到了以上两个选项。我怎么做?或者是否有更好(即理智)的方式来做我想做的事情?
答案 0 :(得分:1)
Django也应该在启动时加载urls.py
;我不能告诉你这是否适合你的代码,但如果你愿意,可以尝试一下!
答案 1 :(得分:1)
您是否考虑过连接post_syncdb
信号?也许您可以在接收此信号时运行自定义SQL。这可能会解决您的部分问题;你仍然需要弄清楚如何在服务器启动时运行SQL。
答案 2 :(得分:1)
您可以勾选settings.py:
import sys
...
IN_SYNCDB = ('syncdb' in sys.argv)
然后
if not settings.IN_SYNCDB:
# run SQL code
答案 3 :(得分:0)
如何进行一些异常处理?在执行查询但数据库表不存在时,会引发Django.db.utils.DatabaseError
。尝试..除了查询代码是我认为符合您的第二个标准的方式。
问题: models.py
class Foo(Model):
#model definition here
def fun():
obj=Foo.objects.get(pk=1)
#other logics here...
fun() #This causes a DatabaseError
解决方案: models.py
class Foo(Model):
#model definition here
def fun():
obj=Foo.objects.get(pk=1)
#other logics here...
try:
fun()
except DatabaseError:
pass