Python 为什么';我的Django站点在使用此URL解析器检查时是否返回404?

Python 为什么';我的Django站点在使用此URL解析器检查时是否返回404?,python,django,web-applications,Python,Django,Web Applications,下面是一个简单的python函数,用于检查给定url是否有效: from httplib import HTTP from urlparse import urlparse def checkURL(url): p = urlparse(url) h = HTTP(p[1]) h.putrequest('HEAD', p[2]) h.endheaders() if h.getreply()[0] == 200: return 1

下面是一个简单的python函数,用于检查给定url是否有效:

from httplib import HTTP
from urlparse import urlparse

def checkURL(url):
    p = urlparse(url)
    h = HTTP(p[1])
    h.putrequest('HEAD', p[2])
    h.endheaders()
    if h.getreply()[0] == 200:
        return 1
    else: return 0
这适用于大多数网站,但对于我基于Django的网站,即使我输入的url明显错误,我也会得到200个状态码。如果我在浏览器中查看同一页,我会得到404。例如,以下页面给出了浏览器中的404:

但使用此脚本检查时给出200。为什么?

编辑:虽然mopoke的回答从Django的角度解决了这个问题,但上面的脚本中也有一个缺陷:

而不是解析url,然后使用

 h.putrequest('HEAD', p[2])
我实际上需要在请求中使用url,如下所示:

h.putrequest('HEAD', url)

这解决了问题。

您的页面实际上没有返回404状态代码:

alex@alex-laptop:~$ curl -I http://wefoundland.com/GooseBumper
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 30 Dec 2009 01:37:41 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

您的页面实际上没有返回404状态代码:

alex@alex-laptop:~$ curl -I http://wefoundland.com/GooseBumper
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 30 Dec 2009 01:37:41 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

尽管内容显示404,但该站点在标题中返回200 OK:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 30 Dec 2009 01:38:24 GMT
Content-Type: text/html; charset=utf-8
Connection: close
确保您的响应使用的是
httpresponseontfound
。e、 g:

    return HttpResponseNotFound('<h1>Page not found</h1>')
返回HttpResponseNotFound('未找到页面')

尽管内容显示404,但该站点在标题中返回200 OK:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 30 Dec 2009 01:38:24 GMT
Content-Type: text/html; charset=utf-8
Connection: close
确保您的响应使用的是
httpresponseontfound
。e、 g:

    return HttpResponseNotFound('<h1>Page not found</h1>')
返回HttpResponseNotFound('未找到页面')

要获取Django视图返回的404,请使用HttpResponseNotFound而不是HttpResponse,或者将'status=404'传递给HttpResponse构造函数。

要获取Django视图返回的404,请使用HttpResponseNotFound而不是HttpResponse,或者将“status=404”传递给HttpResponse构造函数。

我使用的是带有自定义模板的render\u-to\u响应,因此我将其更改为:t=get\u-template('404.html')c=Context(my\u-Context)html=t.render(c)return HttpResponseNotFound(html)我正在使用带有自定义模板的render\u-to\u-response,因此我将其更改为:t=get_template('404.html')c=Context(my_Context)html=t.render(c)return-HttpResponseNotFound(html)