【问题标题】:Django DetailView raise 404 not found error in real serverDjango DetailView 在真实服务器中引发 404 not found 错误
【发布时间】:2019-08-13 17:27:36
【问题描述】:

我使用 Django 2.1、Python 3.5 和 MySql (MariaDB 10)。 localhost 中的所有内容都是正确的,但在真实服务器中,DetailView 会引发 404 错误。请帮我。 我的查看代码是:

class Blog_detail(DetailView):
    model = Post
    template_name = 'detail.html'

我的网址格式是:

path('blog/<str:slug>/', views.Blog_detail.as_view(), name='detail'),

我的连接是:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        # 'PORT': '3306',
        'OPTIONS': {
          'charset': 'utf8'
        },
    }

DetailView 结果仅在拉丁 URI 中正常工作,但在 utf-8 或 Unicode URI 中引发 404 错误。

【问题讨论】:

  • 您能提供一些有关您的实时服务器设置的提示吗?你用的是 nginx 吗?此外,您能否在服务器环境中添加一些日志记录,以便确定请求是否到达视图? (是解析url失败,还是获取object失败?)
  • 你的真实数据库中是否真的有一篇关于那个蛞蝓的帖子?
  • @Geekfish 我的服务器是 nginx。并且它无法获取对象。
  • @Daniel-roseman 是的,当然,我也将那个 slug 记录更改为拉丁文本并正常工作!仅在 utf8 中显示此错误。
  • 能否添加一些日志记录,以便查看视图接收到的slug 参数是什么?您的数据库设置在服务器和本地是否相同?某种相关的东西,你可能想在mysql中使用utf8mb4而不是utf8,因为奇怪的是utf8不支持Unicode字符。

标签: mysql django mariadb


【解决方案1】:

感谢大家。我找到了我的问题的答案。我可以使用以下代码:

class BlogDetail(DetailView):
    model = Post
    template_name = 'detail.html'
    
    def get_object(self, **kwargs):
        slug = self.kwargs.get('slug')
        return get_object_or_404(Post, slug=uri_to_iri(slug))

【讨论】:

    【解决方案2】:

    使用 FBV 代替 CBV。

    使用以下代码:

    from django.shortcuts import get_object_or_404
    from django.utils.encoding import uri_to_iri 
    
    def blog_detail(request, slug):
        post= get_object_or_404(Post, slug=uri_to_iri(slug))
    

    【讨论】:

    • 谢谢,成功了。但我应该只使用基于类的视图。
    猜你喜欢
    • 2019-12-09
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2016-09-02
    • 2012-09-20
    • 2018-04-17
    相关资源
    最近更新 更多