龙卷风:为什么我会收到http 500错误

时间:2017-05-01 06:41:13

标签: html twitter-bootstrap css3 server tornado

我使用python tornado构建一个简单的Web服务器。这是龙卷风的代码:

import json
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=80, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
        def get(self, param):
            print("\n\nthis is a get request from indexhandler:")
            if param:
                print("param is NOT null")
                self.render(r"frontend/" + param)
            else:
                print("param is null")
                self.render(r"frontend/index.html")

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/(.*)", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

所有前端代码都在目录/前端,所以我使用了一个简单的正则表达式(。*)来允许用户访问/ frontend中的所有资源,例如js文件和css文件。

但是,当我尝试访问我的网站时,我在服务器上收到了304错误:

  

[I 170501 14:31:59 web:2063] 200 GET /html/country.html
  [I 170501 14:31:59 web:2063] 304 GET /css/bootstrap.min.css
  [I 170501 14:31:59 web:2063] 304 GET /css/reset.css
  [I 170501 14:31:59 web:2063] 304 GET /css/icon/iconfont.css
  [I 170501 14:31:59 web:2063] 304 GET /css/country.css
  [I 170501 14:31:59 web:2063] 304 GET /css/common.css

更新
我有另一个问题:错误500

总之,我有304和500左右。所有500都是这样的:

[E 170501 22:53:19 web:1590] Uncaught exception GET /images/main-img1.jpg (X.X.X.X)
    HTTPServerRequest(protocol='http', host='X.X.X.X', method='GET', uri='/images/main-img1.jpg', version='HTTP/1.1', remote_ip='X.X.X.X', headers={'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', 'Accept': 'image/webp,image/*,*/*;q=0.8', 'Host': 'X.X.X.X', 'Referer': 'http://X.X.X.X/html/country.html', 'Connection': 'keep-alive', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'})
    Traceback (most recent call last):
      File "/usr/local/lib/python3.5/site-packages/tornado/web.py", line 1509, in _execute
        result = method(*self.path_args, **self.path_kwargs)
      File "tmp.py", line 20, in get
        self.render("frontend/" + param)
      File "/usr/local/lib/python3.5/site-packages/tornado/web.py", line 724, in render
        html = self.render_string(template_name, **kwargs)
      File "/usr/local/lib/python3.5/site-packages/tornado/web.py", line 862, in render_string
        t = loader.load(template_name)
      File "/usr/local/lib/python3.5/site-packages/tornado/template.py", line 427, in load
        self.templates[name] = self._create_template(name)
      File "/usr/local/lib/python3.5/site-packages/tornado/template.py", line 455, in _create_template
        template = Template(f.read(), name=name, loader=self)
      File "/usr/local/lib/python3.5/site-packages/tornado/template.py", line 304, in __init__
        reader = _TemplateReader(name, escape.native_str(template_string),
      File "/usr/local/lib/python3.5/site-packages/tornado/escape.py", line 218, in to_unicode
        return value.decode("utf-8")
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
[E 170501 22:53:19 web:2063] 500 GET /images/main-img1.jpg (X.X.X.X) 2.07ms

1 个答案:

答案 0 :(得分:1)

HTTP 304是“未修改”。这不是错误,而是优化。 Tornado(与大多数Web服务器一样)告诉浏览器每个静态文件的最后修改日期及其内容的校验和(以HTTP术语表示“ETag”)。当浏览器再次请求文件时,浏览器告诉Tornado最后修改日期和ETag在浏览器的缓存副本中有哪些; Tornado将它们与它们自己进行比较,如果它们没有改变,只需告诉浏览器“304 Not Modified”。因此,浏览器知道它可以使用其缓存副本,而不必重新下载原始文件。

HTTP 500是实际问题。您的模板文件中有一些字符无效UTF-8。显然,第一个字符无效UTF-8,基于错误消息中的“位置0”。