【发布时间】:2015-01-08 00:48:31
【问题描述】:
我刚刚完成了 [bottle tutorial[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 本机数据结构中。现在我仍在使用默认的非线程服务器,但出于性能原因,我希望在将来的某个时候使用像 CherryPy 这样的线程服务器。因此,问题是如何将数据从 Bottle 或任何其他类似的线程安全字典中获取到可以转换为 JSON(轻松)的东西? Bottle 是否会在某处公开 FormsDict-To-Json 函数?
【问题讨论】:
-
虽然我不特别了解Bottle,但您的问题有点令人困惑。你说Bottle 数据结构是线程安全的,因此你认为使用访问它们将不是是线程安全的乙>?我认为线程安全意味着访问是线程安全的。
-
我确信还有其他有趣和/或更好的方法可以实现与您的代码相同的目标,但如果一切都为您工作......也许它不是“好得令人难以置信”?
-
我应该澄清我的问题,尽管我确实说过我是在问“供将来参考”。是的,它正在工作,我今天没有线程问题。但是明天我可能不会在 CherryPy 后面使用 Bottle。而Non-thread-safe部分是通过Bottle外部的bottle数据类型的迭代,慢慢地将数据从一个线程安全的结构复制到一个非线程安全的结构中。
-
你觉得哪一部分不是线程安全的?抄出还是抄入?
-
好的,那么恕我直言,您对大多数编程语言中代码执行方式的基础知识存在误解。教程可能会有所帮助。我没有对此的快速链接,但this section of the Python Language Reference 中涵盖了一些相同的概念
标签: python json dictionary bottle