Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django中创建一个站点的多个版本,但在同一个域但不同的url下运行_Python_Django - Fatal编程技术网

Python 如何在django中创建一个站点的多个版本,但在同一个域但不同的url下运行

Python 如何在django中创建一个站点的多个版本,但在同一个域但不同的url下运行,python,django,Python,Django,我有一个网站,我与django开发,我希望它有两个不同的前端设计,但相同的功能。类似于django的多语言功能。因此,我希望用户能够通过指定版本,即 我创建了一个中间件来检查当前版本,如果发现非默认版本,则恢复为默认版本中间件 class VersioningMiddleware(MiddlewareMixin): def process_request(self, request): path = request.get_full_path() tokens = path

我有一个网站,我与django开发,我希望它有两个不同的前端设计,但相同的功能。类似于django的多语言功能。因此,我希望用户能够通过指定版本,即

我创建了一个中间件来检查当前版本,如果发现非默认版本,则恢复为默认版本
中间件

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配置

urlpatterns = [
path('admin/', admin.site.urls),
url(r'^(?P<version>[a-z][0-9])?/', include('base.all_urls','')),]
urlpatterns=[
路径('admin/',admin.site.url),
url(r'^(?P[a-z][0-9])?/,包括('base.all_url',''),]
因此,这种方法的问题是,我的所有视图都需要一个可选参数version,我不喜欢这个参数

因此,我需要一种更好的方法来实现这一点,而不必为不同的版本使用不同的代码库。如果我可以将版本传递给视图,而不必为所有视图指定可选参数,那么我的计划是使用该版本来渲染每个视图渲染的适当模板


提前感谢

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

对于前端,您只需更改
js
css

“django.core.context\u processors.request”
添加到
settings.py的
中间件
,以便django模板能够访问整个项目中所有模板请求中的查询参数

设置.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 %}
您的URL如下所示:

对于v2

localhost:8000/?version=v2
对于v1

localhost:8000/?version=v1
如果未指定任何内容-默认值

localhost:8000
好处-

  • 无需在后端视图或URL文件中编写此前端版本控制

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


您可以将首选项存储在会话中。谢谢@DanielRoseman,我知道不必在url中指定版本就可以了,但我希望用户在url中指定版本。我真的不明白您想要什么。您希望它位于URL中,而不是URL中的参数?我希望它是URL中的参数,而不必在我的所有视图中指定它因为您正在寻找Django中的API版本控制。这是一个开始: