繁体   English   中英

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

[英]How to create multiple versions of a site in django but run under same domain but different url

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

本地主机:8000 / v1

本地主机: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','')),]

因此,这种方法的问题在于,我的所有视图都应采用我不喜欢的可选参数版本

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

提前致谢

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

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

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

settings.py

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

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

{% 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 %}

您的网址如下:

对于v2

localhost:8000/?version=v2

对于v1

localhost:8000/?version=v1

如果未指定-默认

localhost:8000

好处-

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM