【发布时间】:2017-02-20 11:57:35
【问题描述】:
我正在尝试在我的应用程序中自定义 404 错误页面。在搜索了许多可能的解决方案后,我创建了一个 404.html 模板,添加了一个应该处理 HTTP 错误 404 的方法并编辑了我的 urls.py。
但我想我做错了什么。我的日志出现无效的语法错误,我无法解决。
我的意见.py:
# HTTP Error 400
def page_not_found(request):
response = render_to_response('404.html',context_instance=RequestContext(request))
response.status_code = 404
return response
还有语法错误:
Traceback (most recent call last):
File "/.../myenv/lib/python3.4/site-packages/django/core/urlresolvers.py", line 393, in urlconf_module
return self._urlconf_module
AttributeError: 'RegexURLResolver' object has no attribute '_urlconf_module'
...
File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
File "/home/dcaled/work/portal-interface/portal/urls.py", line 12
handler404 = 'views.handler404'
^
SyntaxError: invalid syntax
有人知道发生了什么吗? 谢谢。
更新: 在@Alasdair 建议之后,我进行了一些更改和修复。错误已停止。
现在,我的 urls.py 是这样的:
handler404 = 'views.page_not_found'
urlpatterns = [
url(r'^$', views.home),]
但在访问不存在的页面时,我仍然没有得到我的自定义 404.html。 相反,会加载默认页面,并显示以下消息:
"未找到
在此服务器上找不到请求的 URL /url/404。"
还有,我的 settings.py:
DEBUG = False
ALLOWED_HOSTS = ['*']
TEMPLATE_DIRS = (os.path.join(BASE_DIR , 'portal/templates'),)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
我的项目树:
├── fb_dev
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
│
└── portal
├── admin.py
├── forms.py
├── json
├── migrations
├── models.py
├── static
├── templates
│ ├── 404.html
│ └── portal
│ ├── base.html
│ ├── home.html
├── templatetags
├── urls.py
└── views.py
【问题讨论】:
-
您使用的是哪个版本的 Django?您的
404.html模板在哪里? -
我的版本是1.8.5。我用模板位置更新了问题。
-
您有
TEMPLATES设置吗?您的代码的其他部分是否成功在portal/templates中找到模板?可能是您的browser 或您的服务器(例如 Apache)劫持了 404 页面。 -
@Alasdair,感谢您继续帮助我。是的,我有一个模板设置。我用它编辑了我的问题。是的,我的代码的其他部分在那里找到模板。我不知道我的浏览器是否在劫持 404 页面。 Firefox 会发生此错误。在 Chrome 中,它会加载“服务器错误 (500)”页面。我在本地运行它。奇怪的是,调试的时候,好像从来没有进入我的page_not_found方法。
-
您应该删除
TEMPLATE_DIRS- 它已过时并且您已经拥有TEMPLATES设置。如果portal在您的INSTALLED_APPS设置中,那么离开'DIRS': []应该没问题。正如我在你的回答中所说,我认为你应该完全删除你的handler404行。你的视图没有做任何特别的事情,所以你让 Django 使用默认的。