如何处理同一站点的两个版本

时间:2011-12-16 20:58:15

标签: python django

我的项目包含同一件事的两个版本。例如,版本1是新手,版本2是二年级学生。为了避免冗余,我使用相同的模板和视图,因为两个版本的实现都没有太大差别。这个网站的唯一区别在于网址。这样

localhost:8000/freshman/computer-science
localhost:8000/sophomore/computer-science

我的网站用户只需点击一个按钮即Freshman或二年级学生即可切换到任何版本的网站。我很困惑 HOW TO 实现这样一种方法,通过这种方法我不会重复自己,并且可以用pythonic方式实现功能。

3 个答案:

答案 0 :(得分:3)

我建议在两者中使用一个url模式,但是将唯一参数传递给每个。您可以使用django.con.urls.defaults.include函数实现此目的。在这种情况下,第一个包含将kwarg current_app设置为freshman,将第二个设置为sophomore

from django.conf.urls.defaults import *

site_patterns = patterns('',
    # put your urls here...
)

urlpatterns = patterns('',
    url(r'^freshman/',
        include(site_patterns, namespace='freshman', app_name='freshman'), {
            'current_app': 'freshman',
        }),
    url(r'^sophomore',
        include(site_patterns, namespace='sophomore', app_name='sophomore'), {
            'current_app': 'sophomore',
        }),
)

然后,像往常一样,你可以在视图中弹出kwarg,并触发该值的独特行为:

def my_view(request, *args, **kwargs):
    current_app = kwargs.pop('current_app')

或者,您可以创建一个装饰器来自动执行此操作以及需要按照此格式对视图执行的任何其他样板。

答案 1 :(得分:0)

有许多方法可以使用django框架实现此功能。我现在建议的一种方法是使用 django session

会话的完整文档可用HERE

您可以在会话中保留变量,将其称为键入。当用户点击Freshman时,在后一种情况下,类型将为'f'或's'。所以

request.session[ 'type' ] = 'f' #when Freshman is clicked
request.session[ 'type' ] = 's' #when Freshman is clicked

要获取该网站使用的类型,只需

request.session.get( 'type', '' ) #this would return 'f' || 's' || ''
当用户没有点击这两个选项中的任何一个时,

''就会出现。

虽然这是一种非常简单和适用的方式,但说实话,我不是使用会话的忠实粉丝,因此,我会急于看到更多的方法被列出。

答案 2 :(得分:0)

如果您的意思是代码和数据库架构相同,但没有共享数据,那么我建议您将应用程序的两个完整,独立的实例部署到一台服务器(或更多,取决于) ,并让您的网络服务器路由/sophomore请求一个应用程序,/freshman请求另一个应用程序。有一个单独的开发/测试设置,并使用版本控制将代码更改推送到两个安装。

通过上面的设置,您可以拥有两个独立的数据库,也可以共享一个数据库,并在配置中添加内容,告诉应用程序如何消除其读写内容的歧义。第二种方法比较棘手。

第三种方法是执行第二种方法的操作,除了部署一个应用程序实例,而不是检查配置以确定应用程序是在大二或新生模式下运行,所有网址都有一个参数作为它们的第一个元素,并在每个视图中检查该参数的值(或者,django可能有一个钩子,用于预处理每个请求,您可以在其中执行必要的操作)。