【问题标题】:How to handle two versions of the same site如何处理同一站点的两个版本
【发布时间】:2012-01-22 07:51:13
【问题描述】:

我的项目由同一事物的两个版本组成。例如版本 1 是大一,版本 2 是大二。为了避免冗余,我使用了相同的模板和视图,因为两个版本中的实现并没有太大的不同。该站点的唯一区别在于网址。这样的

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

我网站的用户只需点击一个按钮,即大一或大二,就可以切换到网站的任何版本。我对如何实现这样的方法感到困惑,通过这种方法我不会重复自己并且可以以pythonic方式实现功能。

【问题讨论】:

  • 您需要这个:Python + Django page redirect 吗?
  • @gecco 一点也不。这与我所问的非常不同。虽然谢谢
  • 我认为,如果您能解释除 url 之外的差异可能会有所帮助 - 他们会访问不同的数据库,或者每个组是否有不同的模型对象,存储在同一个数据库中,还是什么?
  • @Marcin:90% 的模型除了某些字段外是相同的,但是是的,这两个版本的内容会有很大不同。我重复数据会不同 NOT db
  • @Zulaikha:即它是存储在同一个数据库中的不同数据,还是您的意思是不同的数据、不同的数据库、相同的数据库架构?

标签: python django


【解决方案1】:

我建议考虑对两者都使用一个 url 模式,但将唯一的参数传递给每个模式。您可以使用django.con.urls.defaults.include 函数实现此目的。在这种情况下,第一个 include 将 kwarg current_app 设置为 freshman,第二个 include 设置为 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')

或者,您可以创建一个装饰器来自动化这个和任何其他需要在遵循这种格式的视图上完成的样板。

【讨论】:

  • 我可以访问模板中的 kwargs 吗?正如我所说,我对这两种情况都有一个模板,我将不得不使用 if else 条件来满足这两种情况
  • 如果你明确地将它传递到模板的上下文中,你可以访问任何东西。我建议为这些视图创建一个装饰器来自动为您处理类似的事情,和/或使用中间件和上下文处理器的组合将您需要的信息注入请求和请求上下文中。
【解决方案2】:

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

完整的会话文档可在HERE获取

你可以在会话中保留一个变量,我们称之为type。当用户点击 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' || ''

'' 是指用户没有点击这两个选项中的任何一个的情况。

虽然这是一个非常简单和适用的方法,但说实话我不是很喜欢使用 session,因此,我很想看到更多的方法被列出。

【讨论】:

    【解决方案3】:

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

    通过上述设置,您可以拥有两个独立的数据库,也可以共享一个数据库,然后将内容放入配置中以告诉您的应用程序如何区分正在读取和写入的内容。第二种方法比较棘手。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多