Python3 --- Tornado之Tornado.web.Application的settings参数

Tornado.web.Application的settings参数包含多种设置,如一般设置、认证安全、模板和静态文件设置。debug和autoreload用于调试模式,default_handler_class和default_handler_args用于自定义404页面。认证安全设置涉及cookie_secret和xsrf_cookies,模板设置可配置autoescape和compiled_template_cache。此外,static_path和static_url_prefix管理静态文件服务。这些设置提供了对Tornado应用的深度定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tornado.web.Application的settings参数

传递给构造器的附加关键字参数保存在 settings 字典中, 并经常在文档中被称为”application settings”. Settings被用于 自定义Tornado的很多方面(虽然在一些情况下, 更丰富的定制可能 是通过在 RequestHandler 的子类中复写方法). 一些应用程序 也喜欢使用 settings 字典作为使一些处理程序可以使用应用 程序的特定设置的方法, 而无需使用全局变量. Tornado中使用的 Setting描述如下.

 

一般设置(General settings):

  • autoreload: 如果为 True, 服务进程将会在任意资源文件 改变的时候重启, 正如 Debug模式和自动重载中描述的那样. 这个选项是Tornado 3.2中新增的; 在这之前这个功能是由 debug 设置控制的.
  • debug: 一些调试模式设置的速记, 正如 Debug模式和自动重载 中描述的那样. debug=True 设置等同于 autoreload=True, compiled_template_cache=False, static_hash_cache=False, serve_traceback=True.
  • default_handler_class 和 default_handler_args: 如果没有发现其他匹配则会使用这个处理程序; 使用这个来实现自 定义404页面(Tornado 3.2新增).
  • compress_response: 如果为 True, 以文本格式的响应 将被自动压缩. Tornado 4.0新增.
  • gzip: 不推荐使用的 compress_response 别名自从 Tornado 4.0.
  • log_function: 这个函数将在每次请求结束的时候调用以记录 结果(有一次参数, 该 RequestHandler 对象). 默认实现是写入 logging 模块的根logger. 也可以通过复写 Application.log_request 自定义.
  • serve_traceback: 如果为true, 默认的错误页将包含错误信息 的回溯. 这个选项是在Tornado 3.2中新增的; 在此之前这个功能 由 debug 设置控制.
  • ui_modules 和 ui_methods: 可以被设置为 UIModule 或UI methods 的映射提供给模板. 可以被设置为一个模块, 字典, 或一个模块的列表和/或字典. 参见 UI 模块 了解更多 细节.

 

认证和安全设置(Authentication and security settings):

  • cookie_secret: 被 RequestHandler.get_secure_cookie 使用, set_secure_cookie 用来给cookies签名.
  • key_version: 被requestHandler set_secure_cookie 使用一个特殊的key给cookie签名当 cookie_secret 是一个 key字典.
  • login_url: authenticated 装饰器将会重定向到这个url 如果该用户没有登陆. 更多自定义特性可以通过复写 RequestHandler.get_login_url 实现
  • xsrf_cookies: 如果true, 跨站请求伪造(防护) 将被开启.
  • xsrf_cookie_version: 控制由该server产生的新XSRF cookie的版本. 一般应在默认情况下(这将是最高支持的版本), 但是可以被暂时设置为一个较低的值, 在版本切换之间. 在Tornado 3.2.2 中新增, 这里引入了XSRF cookie 版本2.
  • xsrf_cookie_kwargs: 可设置为额外的参数字典传递给 RequestHandler.set_cookie 为该XSRF cookie.
  • twitter_consumer_key, twitter_consumer_secret, friendfeed_consumer_key, friendfeed_consumer_secret, google_consumer_key, google_consumer_secret, facebook_api_key, facebook_secret: 在 tornado.auth 模块中使用来验证各种APIs.

 

模板设置:

  • autoescape: 控制对模板的自动转义. 可以被设置为 None 以禁止转义, 或设置为一个所有输出都该传递过去的函数 name . 默认是 "xhtml_escape". 可以在每个模板中改变使用 {% autoescape %} 指令.
  • compiled_template_cache: 默认是 True; 如果是 False 模板将会在每次请求重新编译. 这个选项是Tornado 3.2中新增的; 在这之前这个功能由 debug 设置控制.
  • template_path: 包含模板文件的文件夹. 可以通过复写 RequestHandler.get_template_path 进一步定制
  • template_loader: 分配给 tornado.template.BaseLoader 的一个实例自定义模板加载. 如果使用了此设置, 则 template_path 和 autoescape 设置都会被忽略. 可 通过复写 RequestHandler.create_template_loader 进一步 定制.
  • template_whitespace: 控制处理模板中的空格; 参见 tornado.template.filter_whitespace 查看允许的值. 在Tornado 4.3中新增.

 

静态文件设置:

  • static_hash_cache: 默认为 True; 如果是 False 静态url将会在每次请求重新计算. 这个选项是Tornado 3.2中 新增的; 在这之前这个功能由 debug 设置控制.
  • static_path: 将被提供服务的静态文件所在的文件夹.
  • static_url_prefix: 静态文件的Url前缀, 默认是 "/static/".
  • static_handler_class, static_handler_args: 可 设置成为静态文件使用不同的处理程序代替默认的tornado.web.StaticFileHandler. static_handler_args, 如果设置, 应该是一个关键字参数的字典传递给处理程序 的 initialize 方法.

 

示例:

import tornado.web
import tornado.ioloop
import tornado.httpserver

class IndexHandler(tornado.web.RequestHandler):
    """主路由处理类"""
    def get(self):
        self.write("Hello World!")

#自定义settings
settings = {
    "template_path":"templates",
    "static_path":"statics",
}

if __name__ == "__main__":

    app = tornado.web.Application([
        (r"/", IndexHandler),
    ],**settings)

    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8000)
    tornado.ioloop.IOLoop.current().start()

 

<think>嗯,用户想了解如何在Tornado框架中使用@tornado.web.authenticated装饰器来处理前端传来的JSON数据和文件上传。首先,我需要回忆一下Tornado的相关文档和功能点。 首先,@authenticated装饰器的作用是确保用户已经通过身份验证,如果没有,会重定向到登录页面。这在处理需要用户认证的请求时非常有用。但用户的问题还涉及到获取JSON数据和文件上传,所以需要结合这两个方面来回答。 接下来,处理JSON数据。在Tornado中,通常可以通过self.get_body_argument()或者self.request.body来获取原始数据,然后使用json模块解析。不过,对于JSON数据,可能更直接的方法是使用self.get_json_body(),但需要注意Tornado的版本是否支持这个方法。或者,用户可能需要手动解析请求体。 然后是文件上传。Tornado处理文件上传通常是通过self.request.files字典,其中每个键对应表单中的文件字段名,值是一个文件对象列表。每个文件对象包含filename、body和content_type等属性。需要确保前端表单的enctype设置为multipart/form-data,并且使用POST方法。 另外,用户可能想知道如何在一个请求中同时处理JSON数据和文件上传。例如,前端可能发送一个包含JSON数据和文件的表单,或者在请求体中混合不同格式的数据。这里可能需要明确前端发送数据的方式,是作为表单数据(multipart/form-data)还是作为JSON请求体(application/json)。如果是后者,文件上传可能需要使用Base64编码或其他方式嵌入到JSON中,但更常见的是使用multipart/form-data来同时上传文件和表单字段。 需要注意的是,@authenticated装饰器应该放在最外层,以确保先进行身份验证,然后再处理数据。例如,在定义请求处理方法时,装饰器的顺序可能会影响执行流程。 可能还需要考虑异步处理,尤其是在处理大文件上传时,Tornado的非阻塞特性如何发挥作用。不过,用户的问题中没有明确提到异步处理,所以可能暂时不需要深入,但可以简单提及。 最后,可能需要给出一个完整的示例代码,展示如何在一个Tornado请求处理类中使用@authenticated装饰器,同时处理JSON数据和文件上传。这包括如何解析请求,获取数据,处理文件保存等步骤。 还需要检查是否有相关的引用内容可以支持回答。根据提供的引用,引用[2]提到Tornado适合API开发,性能强劲,支持非阻塞和epoll,适合处理大量连接。这可能与处理文件上传和JSON数据的性能相关,可以引用这一点来说明Tornado的优势。引用[1]提供了安装和基本文档的参考,可能在示例代码中需要引用。 可能的误区包括:用户可能混淆了处理JSON和文件上传的方式,或者没有正确设置请求头或表单编码类型。需要提醒用户注意前端发送数据时的Content-Type是否正确,例如,对于JSON数据使用application/json,对于文件上传使用multipart/form-data。 总结回答的结构:首先解释@authenticated的作用,然后分步骤说明如何处理JSON数据和文件上传,结合示例代码,最后给出注意事项和相关引用。</think>### Tornado框架中使用@authenticated处理JSON和文件上传 #### 1. `@tornado.web.authenticated` 的作用 该装饰器用于验证用户是否已登录。若未登录,会自动重定向到`settings`中配置的`login_url`(默认为`/login`)。需配合`self.current_user`实现用户状态管理[^2]。 #### 2. 处理JSON数据 **步骤:** 1. **设置请求头**:前端需设置`Content-Type: application/json`。 2. **解析数据**:通过`self.request.body`获取原始字节流,使用`json.loads`解析。 ```python import json class ApiHandler(tornado.web.RequestHandler): @tornado.web.authenticated async def post(self): try: data = json.loads(self.request.body.decode(&#39;utf-8&#39;)) username = data.get(&#39;username&#39;) except json.JSONDecodeError: self.send_error(400, reason="Invalid JSON") ``` #### 3. 处理文件上传 **要求:** - 前端表单需设置`enctype="multipart/form-data"` - 文件字段名需与服务端匹配(如`<input type="file" name="file">`) **服务端代码:** ```python class UploadHandler(tornado.web.RequestHandler): @tornado.web.authenticated async def post(self): # 获取上传的文件列表(支持多文件) files = self.request.files.get(&#39;file&#39;, []) for file in files: filename = file[&#39;filename&#39;] content = file[&#39;body&#39;] with open(f&#39;uploads/{filename}&#39;, &#39;wb&#39;) as f: f.write(content) self.write("上传成功") ``` #### 4. 完整示例(混合处理) ```python import tornado.web import json class HybridHandler(tornado.web.RequestHandler): def get_current_user(self): return self.get_secure_cookie("user") @tornado.web.authenticated async def post(self): # 处理JSON数据 if &#39;application/json&#39; in self.request.headers.get(&#39;Content-Type&#39;, &#39;&#39;): data = json.loads(self.request.body) self.write(f"Received JSON: {data}") # 处理文件上传 elif &#39;multipart/form-data&#39; in self.request.headers.get(&#39;Content-Type&#39;, &#39;&#39;): for file in self.request.files.get(&#39;doc&#39;, []): self.save_file(file[&#39;filename&#39;], file[&#39;body&#39;]) self.write("Files saved") def save_file(self, filename, content): with open(f&#39;uploads/{filename}&#39;, &#39;wb&#39;) as f: f.write(content) ``` #### 注意事项 1. **Content-Type必须明确**: - JSON请求:`application/json` - 文件上传:`multipart/form-data` 2. **大文件优化**:建议使用流式处理或分块上传,避免内存溢出 3. **安全验证**:文件保存时需检查扩展名和内容类型,防止恶意文件上传
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值