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

tornado: why do I get http 500 error

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

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 目录下,所以我使用了一个简单的正则表达式(.*) 来允许用户访问/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

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

HTTP 500 是实际问题。您的模板文件中有一些字符不是有效的 UTF-8。根据错误消息中的 "position 0",显然第一个字符不是有效的 UTF-8。