gpt4 book ai didi

python - 将 Bottle FORMSDICT 转换为 Python 字典(以线程安全的方式)

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:17 25 4
gpt4 key购买 nike

我刚刚学习了[ Bottle 教程[ 1并找到了以下有用的表格(我希望我的格式正确),其中列出了可以访问哪些类型的请求属性

Attribute           GET Form fields     POST Form fields    File Uploads
BaseRequest.query yes no no
BaseRequest.forms no yes no
BaseRequest.files no no yes
BaseRequest.params yes yes no
BaseRequest.GET yes no no
BaseRequest.POST no yes yes

当然我想自己尝试一下,但是因为 Bottle 数据结构是特殊的线程安全版本,而且我想使用 json 以合理的格式打印它,所以我编写了以下(有效的)测试程序

from bottle import run, route, request, response, template, Bottle
import uuid
import json
import os

ondersoek = Bottle()

@ondersoek.get('/x')
@ondersoek.post('/x')
def show_everything():
PythonDict={}
PythonDict['forms']={}
for item in request.forms:
PythonDict['forms'][item]=request.forms.get(item)

PythonDict['query']={}
for item in request.forms:
PythonDict['query'][item]=request.query.get(item)

#The below does not work - multipart/form-data doesn't serialize in json
#PythonDict['files']={}
#for item in request.files:
#PythonDict['files'][item]=request.files.get(item)

PythonDict['GET']={}
for item in request.GET:
PythonDict['GET'][item]=request.GET.get(item)

PythonDict['POST']={}
for item in request.POST:
PythonDict['POST'][item]=request.POST.get(item)

PythonDict['params']={}
for item in request.params:
PythonDict['params'][item]=request.params.get(item)

return json.dumps(PythonDict, indent=3)+"\n"

ondersoek.run(host='localhost', port=8080, reloader=True)

这有效,我得到:

tahaan@Komputer:~/Projects$ curl -G -d dd=dddd http://localhost:8080/x?q=qqq
{
"files": {},
"GET": {
"q": "qqq",
"dd": "dddd"
},
"forms": {},
"params": {
"q": "qqq",
"dd": "dddd"
},
"query": {},
"POST": {}
}

tahaan@Komputer:~/Projects$ curl -X POST -d dd=dddd http://localhost:8080/x?q=qqq
{
"files": {},
"GET": {
"q": "qqq"
},
"forms": {
"dd": "dddd"
},
"params": {
"q": "qqq",
"dd": "dddd"
},
"query": {
"dd": null
},
"POST": {
"dd": "dddd"
}
}

我很确定这不是线程安全的,因为我一次将一个数据项从 Bottle 数据结构复制到 Python native 数据结构中。现在我仍在使用默认的非线程服务器,但出于性能原因,我希望在将来的某个时候使用像 CherryPy 这样的线程服务器。因此,问题是如何从 Bottle 或任何其他类似的线程安全字典中获取数据,并将其转换为可以(轻松)转换为 JSON 的内容? Bottle 是否有机会在某处公开 FormsDict-To-Json 函数?

最佳答案

您的代码线程安全的。即,如果您在多线程服务器中运行它,它会工作得很好。

这是因为多线程服务器仍然只为每个线程分配一个请求。您没有全局数据;您代码中的所有数据都包含在一个请求中,这意味着它在一个线程中。

例如,Request object 的 Bottle 文档说(强调我的):

A thread-local subclass of BaseRequest with a different set of attributes for each thread. There is usually only one global instance of this class (request). If accessed during a request/response cycle, this instance always refers to the current request (even on a multithreaded server).

换句话说,每次您在代码中访问request 时,Bottle 都会施展一些“魔法”,为您提供一个线程本地的Request 对象。这个对象不是全局的;它不同于可能同时存在的所有其他 Request 对象,例如在其他线程中。因此,它是线程安全的。


编辑 以特别回应您关于 PythonDict 的问题:这一行使您的代码线程安全:

PythonDict={}

这是安全的,因为每次线程访问该行代码时,您都会创建一个字典;并且您正在创建的每个字典对于创建它的线程都是本地的。 (用更专业的术语来说:它在堆栈上。)

这与您的线程共享全局 字典的情况形成对比;在那种情况下,您的怀疑是正确的:它不是线程安全的。但在您的代码中,字典是本地的,因此不存在线程安全问题。

希望对您有所帮助!

关于python - 将 Bottle FORMSDICT 转换为 Python 字典(以线程安全的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26865432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com