代码之家  ›  专栏  ›  技术社区  ›  Vlad the Impala

为什么我的django站点在用这个URL解析器检查时不返回404?

  •  1
  • Vlad the Impala  · 技术社区  · 16 年前

    下面是一个简单的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: http://wefoundland.com/GooseBumper

    但当用这个脚本检查时给出200。为什么?

    编辑 当莫波克的回答解决了问题的时候, 上面的脚本中也有一个错误 :

    而不是解析URL,然后使用

     h.putrequest('HEAD', p[2])
    

    我实际上需要在请求中使用URL,比如:

    h.putrequest('HEAD', url)
    

    解决了这个问题。

    3 回复  |  直到 16 年前
        1
  •  1
  •   mopoke    16 年前

    虽然内容显示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
    

    确保您的回答使用 HttpResponseNotFound . 例如。:

        return HttpResponseNotFound('<h1>Page not found</h1>')
    
        2
  •  0
  •   Alex Gaynor    16 年前

    您的页面实际上没有返回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
    
        3
  •  0
  •   spookylukey    16 年前

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