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