如何在Django中创建网站的多个版本,但在相同的域但不同的URL下运行

时间:2018-12-26 06:36:46

标签: python django

我有一个用django开发的网站,我希望它具有2种不同的前端设计但功能相同。与django多语言功能非常相似。所以我希望用户能够通过指定版本即

从不同的URL访问这两种设计 localhost:8000/v1

localhost:8000/v2

我创建了一个中间件来检查当前版本,如果未找到,请还原为默认值。
中间件

class VersioningMiddleware(MiddlewareMixin):

def process_request(self, request):
    path = request.get_full_path()
    tokens = path.split("/")
    if len(tokens) > 1:
        if tokens[1] in APP_VERSIONS: # APP_VERSION is a list ['v1','v2',...]
            request.app_version = tokens[1]
    new_url = "v1%s" % path
    return HttpResponseRedirect(new_url)

我也使用此映射出了所有应用url conf

urlpatterns = [
path('admin/', admin.site.urls),
url(r'^(?P<version>[a-z][0-9])?/', include('base.all_urls','')),]

所以这种方法的问题在于,我希望所有视图都使用一个我不喜欢的可选参数 version

所以我需要一种更好的方法来实现这一目标,而不必为不同版本使用不同的代码库。如果我可以在无需为所有视图指定可选参数的情况下将版本传递给视图,则我的计划是使用该版本来呈现每个视图呈现的适当模板。

预先感谢

1 个答案:

答案 0 :(得分:0)

正如您所说,仅前端需要不同的版本,并保持功能相同。

对于前端,您只需要更改jscss

"django.core.context_processors.request"添加到MIDDLEWARE的{​​{1}}中,以便Django模板能够在整个项目的所有模板中访问请求中的查询参数

settings.py

settings.py

现在,在模板文件中,您将能够检索查询参数并直接进行评估

MIDDLEWARE = [
    ...
    ...
    "django.core.context_processors.request",
]

您的网址应为:

对于v2

{% if request.GET.version == 'v2' %} 
    loading version two... write tags, load here css,js to be loaded if version is v2
{% elif request.GET.version == 'v1' %}
    loading version two... write tags, load here css,js to be loaded if version is v1
{% else %}
    loading defaults.. write tags, load default css,js to be loaded if no version queried by user
{% endif %}

对于v1

localhost:8000/?version=v2

如果未指定-默认值

localhost:8000/?version=v1

好处-

  • 无需在后端视图或url文件中编写有关此前端版本的信息

  • 只有更改HTML模板才能允许更改前端的版本