[英]Multiple instances of celerybeat for autoscaled django app on elasticbeanstalk
[英]Multiple Instances of a django app, does django support this
我已经在Django中编写了一个简单的反馈应用程序。 它并不是特别复杂,基本上,它允许经过身份验证的用户编写带有主题行的快照消息,并通过表单提交该消息。 然后,我允许选定组中的谁查看用户提交的反馈。 将来我可能会添加更多功能,但是现在它可以满足我的要求。
我的问题来了,我正在建设的网站有多个我想使用反馈应用程序的地方,例如,我有一个“您如何看待该网站?” /dev/feedback/
此类页面。“ / support / feedback /”上也有一个客户支持反馈的页面。目前,我刚刚将代码从mysite.apps.dev.feedback
复制到mysite.apps.support.feedback
。
问题在于,这现在已经创建了同一代码的两个单独的副本。 尽管刚刚编写了该应用程序,但这两个版本已经开始出现差异,这很烦人。 我的问题只是简单地如何在具有不同数据库模型的Django站点中创建同一应用程序的多个实例?
我发现一些相关但无用的资源是https://docs.djangoproject.com/en/dev/topics/http/urls/和Django中反向命名空间的URL:同一应用程序的多个实例第一页没有提供在此问题上有很多内容,第二页提供了一些笨拙和不切实际的解决方案,这些解决方案似乎既无关紧要,又比其价值更大。 有没有适当的方法来实现同一Django应用程序的多个实例?
我个人试图将其保留为一个应用程序,并具有可以处理从多个位置发布/适当标记它们的视图。
正如S.Lott所说,这是要走的路 。 如果您对将代码保持在其他情况下的某个位置的方法感到好奇,我会提供其他选择。
例如,您可以在模型中添加一个category
字段,设置一个URL conf,该URL接受URL中的参数,例如/(?P<category>\\w+/feedback/$
并让视图简单地将反馈标记为适当的类别。
class MyForm(forms.ModelForm):
class Meta:
model = Feedback
def my_view(request, category):
form = MyForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
feedback = form.save(commit=False)
feedback.category = category
feedback.save()
return http.HttpResponse("Thanks for posting!")
return render(request, "mytemplate.html", {'form': form})
# urls.py
(r'^(?P<category>\w+)/feedback/$', 'my_view')
# user can visit dev/feedback or support/feedback and the feedback will be tagged appropriately
另一个解决方案是构建一个抽象基类 ,然后为不同的表创建子类。 那应该解决您的代码不同步的问题。
您将有一个抽象模型(没有表),您的单独应用程序中的“真实”模型将基于该抽象模型。
如果必须具有单独的模型,则可以编写动态构造的视图。
def view_generator(model_class):
class MyForm(forms.ModelForm):
class Meta:
model = model_class
def my_view(request):
form = MyForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
form.save()
return http.HttpResponse("Thanks for posting!")
return render(request, "mytemplate.html", {'form': form})
return my_view
# urls.py
from foo import view_generator
(r'^my_first_feedback_form', view_generator(Model1))
(r'^my_second_feedback_form', view_generator(Model2l))
如何在具有不同数据库模型的Django站点中创建同一应用程序的多个实例?
你不应该
您只需在from feedback.models import Feedback
一个from feedback.models import Feedback
,即可在其他两个app中简单使用feedback app模型。
然后,您的support
应用程序可以创建,检索,更新和删除反馈对象。
同样,您的dev
应用程序可以导入模型,因此可以创建,检索,更新和删除“反馈”对象。
这就是所有需要的内容: import
。
感谢Yuji Tomita的非常彻底的回答,我的最终解决方案非常接近他的建议,但又有很大的不同,以至于我认为如果其他人遇到与我相同的情况,我会将其发布为另一种选择。
首先,在我的mysite.apps.feedback.models
文件中
class Feedback( models.Model ):
subject = models.TextField( max_length=100 )
body = models.TextField( max_length=100 )
# Some other stuff here...
# Finally I used the suggestion above and created a field which I
# use to label each entry as belonging to a specific instance of the app.
instance_name = models.TextField( max_length=20 )
在我的mysite.apps.feedback.views
文件中
def save_message( request, instance_name ):
if request.method == 'POST':
form = FeedbackFrom( request.POST )
if form.is_valid():
form.instance.instance_name = instance_name
form.save()
return render("feedback/thanks.html")
else:
return render("feedback/submit.html", {'form':form })
else:
return render("feedback/submit.html",{'form':FeedbackForm()})
@user_passes_test( is_staff )
def all_messages( request, instance_name ):
messages = Feedback.objects.filter( instance_name = instance_name )
return render("feedback/view_all.html",{'feedback':messages} )
在我的mysite.apps.dev.urls
文件中
url(r'^feedback/', include('mysite.apps.feedback.urls'),
{'instance_name':'dev'}),
在我的mysite.apps.support.urls
文件中
url(r'^feedback/', include('mysite.apps.feedback.urls'),
{'instance_name':'support'}),
这将按应用程序实例分隔反馈消息。 请注意,我的实际代码更加复杂,但这对于遇到类似问题的任何人来说都足够好,可以迅速启动解决方案并开始运行。 希望这对处于类似情况的任何人都有用。 再次感谢Yuji Tomita提供此解决方案所依据的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.