2016-03-09 103 views
7

我正在使用Django 1.9.3。我有一个项目与几个应用程序。我想在项目启动时更新其中一个应用程序的表格。Django - 在启动时执行代码

用例:

例如,假设我想卖掉我的网站上的项目。我有一个包含模型Item的应用程序。我在Django之外有一个web服务,它提供服务“give_all_items_available()”。我想通过网站向我的用户提供项目列表。所以我认为我必须定期更新我的数据库(在启动时和每隔一段时间)使用该Web服务输入。

我把所有的代码编写的,它看起来像下面的(这是一个例子):

from my_app.models import My_table 

def on_startup(): 
    my_thread = Thread(execute = populate_tables, loopmode = True, background = True) # thread running in loopmode in background 
    my_thread.start() # starts the thread and returns 

def populate_tables() 
    response = call_webservice() # let's imagine this method returns data for creating a new model instance 
    My_table(response).save() # this save() isn't threadsafe in this example, but that's not my point ;-) 

我的问题是我不知道在哪里可以编写代码

尝试:

到目前为止,在Django 1.6.5中,我使用了我的应用的init .py文件中的一些代码。它正在工作,但我认为它非常难看(用“导入”开始线程看起来非常像隐藏的代码)。

我在Django 1.9中看到了“ready()”方法。但它写在文档中,不处理这种方法中的模型,所以我很困惑。

我可以在启动我的服务器的命令中添加启动代码,但此启动代码是面向应用程序的,在我看来,这些项目与它无关。

你会推荐什么?

如果需要,我很乐意提供更多信息。

由于提前,

+1

你可能会发现一些有用的[这个stackoverflow问题](http://stackoverflow.com/questions/2781383/where-to-put-django-startup-code)。 – Robin

+0

我已经看到它了,这个链接的接受答案提到了像我这样的“ready()”方法。但根据Django doc,在这种方法中与模型进行交互是一种不好的做法...... –

+3

“启动”在这种情况下意味着什么?通常你会开始一个网站,然后继续运行。为什么您需要在“启动”时填充表格,而不是在迁移中? –

回答

1

为什么你不使用Celery呢?我知道你在问起如何在启动时填充你的Item表,但是......我认为这里的一个预定的芹菜任务适合并以自然的方式解决你的问题。

+0

虽然这个链接可能回答这个问题,但最好在这里包括答案的基本部分,提供链接供参考。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/11771232) –

+0

@MikeC,我很感谢你的评论,但答案的重要部分包括:“一个预定的任务”,我还包括一个名字我们可以用来解决的工具:芹菜,链接只是这个工具的捷径。 – trinchet

+1

以及芹菜可能是一个选择,但我认为Django已经提供了方法来做我需要的东西,而不必依赖芹菜。事实上,我将使用芹菜来改善我的计划的那一天,然后我会考虑这一点,但我不希望仅仅因为芹菜而依赖芹菜。管理的东西是我所需要的,我认为,到目前为止它的工作 –

相关问题