【问题标题】:Django url path converter not working in productionDjango url路径转换器在生产中不起作用
【发布时间】:2021-05-21 13:43:26
【问题描述】:

我在我的 django 应用程序中使用路径转换器,如下所示:

# urls.py

from . import views
from django.urls import path

urlpatterns = [
  path('articles/<str:collection>', views.ArticleView),
]


# views.py

@login_required
def ArticleView(request, collection):
    print(collection)
    if collection == "None":
        articles_query = ArticleModel.objects.all()
    ...

这在开发中可以正常工作,因为 url 很烂:http://localhost:8000/articles/My Collection,它被编码为 http://localhost:8000/articles/My%20Collection,并在 ArticleView 中正确解码。但是,在开发中,我必须像这样编辑视图才能使其工作:

# views.py

import urllib.parse

@login_required
def ArticleView(request, collection):
    collection = urllib.parse.unquote(collection)
    print(collection)
    if collection == "None":
        articles_query = ArticleModel.objects.all()
    ...

否则,print(collection) 会显示 My%20Collection,而其余视图中的整个逻辑将失败。

requirements.txt

asgiref==3.2.10
Django==3.1.1
django-crispy-forms==1.9.2
django-floppyforms==1.9.0
django-widget-tweaks==1.4.8
lxml==4.5.2
Pillow==7.2.0
python-pptx==0.6.18
pytz==2020.1
sqlparse==0.3.1
XlsxWriter==1.3.3
pymysql

我在这里做错了什么? 提前致谢!

【问题讨论】:

  • “这也发生在管理界面中。”你能更具体地说明那里发生的事情吗?
  • 我错了,我在管理界面中遇到的问题无关,我已经相应地编辑了问题。

标签: django production url-parameters urlparse


【解决方案1】:

正在对 URL 进行 urlencoded,它将空格编码为 %20。还有许多其他编码。正如您所发现的,您需要对该参数进行解码,以便将其与您期望的进行比较。正如您可能已经意识到的那样,如果您的值实际上需要The%20News 而不是The News,则您没有追索权。为了处理这个问题,人们将创建一个蛞蝓场。 Django has a model field for this in the framework.

这通常是记录的 URL 友好的唯一值。

假设您将slug = models.SlugField() 添加到ArticleModel,您的网址和视图可以更改为:

urlpatterns = [
  # Define a path without a slug to identify the show all code path and avoid the None sentinel value.
  path('articles', views.ArticleView, name='article-list'),
  path('articles/<slug:slug>' views.ArticleView, name='article-slug-list'),
]


@login_required
def ArticleView(request, slug=None):
    articles_query = ArticleModel.objects.all()
    if slug:
        articles_query = articles_query.filter(slug=slug)

【讨论】:

  • 非常感谢您的详细回答。我理解对 slug 字段的需求,但是,我仍然不明白为什么不使用 slug 字段,就像我在开发中工作得很好但在生产中不能正常工作?
  • 似乎runserver 正在自动解码参数。我想知道它的运行方式是否与您使用的网络服务器不同。
  • 这可能是正在发生的事情,我会尝试获取更多信息。非常感谢!
猜你喜欢
  • 2019-06-08
  • 2016-03-31
  • 2013-10-20
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2014-10-05
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多