我想将一个POST从Webob MultiDict转换为嵌套字典.例如
所以从POST:
'name=Kyle&phone.number=1234&phone.type=home&phone.number=5678&phone.type=work'
Run Code Online (Sandbox Code Playgroud)
多元化;
[('name', 'Kyle'), ('phone.number', '1234'), ('phone.type', 'home'), ('phone.number', '5678'), ('phone.type', 'work')]
Run Code Online (Sandbox Code Playgroud)
到嵌套字典
{'name': 'Kyle',
'phone': [
{
'number': '12345',
'type': 'home',
},{
'number': '5678',
'type': 'work',
},
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑
我最终variable_decode从Will发布的formencode包中提取了该方法.唯一需要的改变是明确列表,例如
'name=Kyle&phone-1.number=1234&phone-1.type=home&phone-2.number=5678&phone-2.type=work'
Run Code Online (Sandbox Code Playgroud)
哪个更好有很多原因.
在webapp2 文档中没有提到设置SameSitecookie的属性,它似乎是建立在 WebOB 的响应处理程序上的,我检查了 webOB 文档页面,它清楚地显示了'SameSite' flag as an accepted cookie parameter
尽管如此,我还是尝试在 set cookie 中设置它:
self.response.set_cookie(name, secure_cookie, path='/', secure=True,
httponly=True, samesite='lax', expires=expireDate)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
TypeError: set_cookie() got an unexpected keyword argument 'samesite'
我知道可以使用,self.response.headers.add_header('Set-Cookie', ...但我希望我可以self.response.set_cookie按照 webapp2 文档使用
我是一个"自己动手"的那种人,但是我想确保我不会因为尝试咬掉比我能咀嚼更多的东西.
我正在编写一个基于浏览器的地图应用程序,需要在最终用户的计算机上运行独立(无互联网连接).也就是说,应用程序是某种服务器,在许多情况下,它将安装在最终用户的计算机上,浏览器将指向某个localhost URL来访问它.
我将在客户端使用MapLayers,服务器端将有一堆特定于应用程序的自定义逻辑,例如以某些自定义方式处理地图上的点击事件,在特定时间在地图上创建各种自定义对象,等等.
对于服务器的"业务逻辑"部分,我很高兴使用带有python的paste/webob.这是一个简单的基础架构,可以让我轻松地放入所有这些自定义逻辑.
我一直在想客户端会与两台服务器进行通信:这个粘贴/ webob业务逻辑服务器,以及一台服务于WMS和WFS地图元素的服务器.所以我看着MapServer和GeoServer处理地图部分......我不高兴.
我不高兴,因为我不想在客户端机器上安装和担心"野兽".对于MapServer,我真的不想安装像Apache这样的成熟的Web服务器,并且必须处理CGI,PHP和MapScript.对于GeoServer,可能(可能)安装Java,并处理GeoServer设置和管理的各种复杂性.
部分原因只是学习曲线问题.如果我可以避免它,我对学习MapServer或GeoServer的复杂性并不是特别感兴趣.我安装了GeoServer,将其指向我的一些数据,并且能够使用GeoServer良好的Web管理员内置的MapLayers预览来查看我的数据.但当我尝试使用我自己的GeoServer指向的MapLayers网页提供真实的数据时,我崩溃了GeoServer.我可能会崩溃服务器只是从客户端发送一些可能是格式错误的请求对我来说是非常令人惊讶的.我可以深入研究GeoServer日志,试图弄清楚我做错了什么,但是......我真的不想花很多时间在那上面.
所以,我正在考虑使用我已经拥有的粘贴/ webob服务器自己实现WMS和WFS接口的部分.事实上,我可能只需要WMS,因为我可以通过一个简单的自定义协议来处理矢量对象,我将这些协议传递给客户端,然后客户端可以使用OpenLayers直接创建和操作对象.
我查看了WMS的规范和示例消息(在WFS上稍微少一点).我自己实现这个协议似乎并不那么困难,特别是因为在这种情况下我完全控制了客户端 - 这不像我需要能够充当通用的WMS或WFS服务器; 我只需要让我自己的OpenLayers客户满意.
我需要WMS服务器的两个主要功能是:
从我提前创建的预渲染瓷砖商店中提供瓷砖(我将使用OpenStreetMap数据预渲染瓷砖,使用mapnik作为渲染引擎;我将使用普通的Google Maps样式瓷砖命名方案存储和访问它们那个OpenLayers预计)
能够服务器修改这些瓦片的版本,其中我在本地存储的某些数据被绘制在瓦片之上.例如,我可能在一个"图层"上有10000个点,在另一个图层上有10000个多边形,当用户激活这些图层时,我将提供相同的基础图块,但是当我提供这些图块时,我将呈现这些附加功能在它们之上,可能我将实现一个简单的缓存方案,以保持这些过度渲染的磁贴一段时间.
所以我的问题是:尽管我知道现有的工具可以做这些事情(MapServer,GeoServer,TileCache等),但实际上我觉得仅仅回应一些简单的WMS消息对我来说就不那么重要了,在python中自己对我的瓷砖进行额外的过度绘图,确保所有内容都能正确投影等.我不需要为这些过度图层绘制花哨的宽街道或任何东西,只需简单的线条,图标和标签.拥有一个只有python的解决方案听起来很简单.
我想如果我需要扩展到支持更多的WMS/WFS协议,或者进行更高级的透支,我可以在那时插入MapServer/GeoServer.
这里有陷阱我不考虑吗?
我们正在“仅”使用 WebOb 开发一个实验性 Web 框架。我们正在处理并发请求,这基本上是 WebOb 的一个非常简单的集成。我们在 webfaction.com 上托管我们的应用程序
问题是我们的日志中出现了致命的 Python 错误:
Fatal Python error: XXX block stack underflow
Run Code Online (Sandbox Code Playgroud)
没有其他回溯或信息。它使我们的应用程序崩溃(几分钟后它会自动重新启动)。我们在开发过程中从未遇到过这个问题。
编辑:我已经检查过,我的 python 应用程序内存太高,这可能是一个相关的问题
问题是,当我尝试交叉引用访问日志时,没有任何内容与该访问时间相对应。
正如我所说,没有有关错误的回溯或信息。
所以,我首先搜索了Python中的块堆栈下溢,我发现了这篇非常有趣的文章:http://tech.blog.aknin.name/2010/07/22/pythons-innards-interpreter-stacks/,它解释了什么是块堆栈下溢。
编辑:我还尝试删除所有 .pyc 并重新启动服务器。没有结果
所以,这是我的问题:什么可能导致编译器中的块堆栈下溢?什么“类型”的代码可能会导致这种情况?
我试图了解在wsgi应用程序中安全处理文件上传的最佳方法。似乎很多解决方案都涉及使用cgi模块中的FieldStorage来解析表单数据。据我对FieldStorage的了解,它通过将数据流传输到临时文件中来在幕后执行一些“魔术”操作。
我还不是100%清楚的是如何限制包含大于指定数量(例如10MB)的文件的请求。如果有人上载了一个大小为GB的文件,您显然希望在该请求通过服务器磁盘空间之前阻止该请求,对吗?
限制wsgi应用程序中文件上传的最佳方法是什么?
假设我有一个这样的表格:
<form id='myform'>
Favorite colors?
<input type='checkbox' name='color' value='Green'>Green
<input type='checkbox' name='color' value='Blue'>Blue
<input type='checkbox' name='color' value='Red'>Red
<input type='submit' value='Submit'>
</form>
Run Code Online (Sandbox Code Playgroud)
如何使用webtest的表单库来测试提交多个值?
我正在创建一个实用程序来处理基于 webob 的应用程序中的文件上传。我想为它编写一些单元测试。
我的问题是 - 当 webobcgi.FieldStorage用于上传文件时,我想以FieldStorage一种简单的方式创建一个实例(不模拟整个请求)。我需要做的最少代码是什么(没什么特别的,模拟带有“Lorem ipsum”内容的文本文件的上传就可以了)。或者嘲笑它是一个更好的主意?
在加载我的 Flask 应用程序之前,我需要从 wsgi 请求中读取一些值。如果我从 wsgi 请求中读取了 url,则在加载 Flask 应用程序后(在中间件运行之后),我可以毫无问题地访问该文件。
但是,如果我尝试访问参数,它似乎会在加载 Flask 应用程序后删除发布数据。我什至走极端,用一个特殊的 Webob 请求来包装 wsgi 请求,以防止这个“只读一次”问题。
有谁知道如何在中间件中访问来自 wsgi 请求的值而不会对请求造成任何副作用,以便您可以在 Flask 应用程序中获取发布数据/文件数据?
from webob import Request
class SomeMiddleware(object):
def __init__(self, environ):
self.request = Request(environ)
self.orig_environ = environ
def apply_middleware(self):
print self.request.url #will not do any harm
print self.request.params #will cause me to lose data
Run Code Online (Sandbox Code Playgroud)
这是我的烧瓶视图
@app.route('/')
def hello_world():
from flask import request
the_file = request.files['file']
print "and the file is", the_file
Run Code Online (Sandbox Code Playgroud) 假设我有一个包含以下内容的字节流:
POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"]
有没有办法从中产生WSGI风格的"环境"字典?
希望,我忽略了一个简单的答案,并且它与相反的操作一样容易实现.考虑:
>>> import json
>>> from webob import Request
>>> r = Request.blank('/mum/ble?q=huh')
>>> r.method = 'POST'
>>> r.content_type = 'application/json'
>>> r.charset = 'utf-8'
>>> r.body = json.dumps(['do', 're', 'mi'])
>>> print str(r) # Request's __str__ method gives raw HTTP bytes back!
Run Code Online (Sandbox Code Playgroud)
POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"]
我正在使用Ian Bicking的WebOb来编写Python Web应用程序测试.我调用webob.Request.blank('/path...'),然后使用生成的请求对象的get_response(app)方法来调用我的Web应用程序.返回的响应对象允许我检查HTTP响应的状态代码,内容类型,正文等.构建POST请求也很容易:
Request.blank('/path/under/test/', POST={'query': 'some text'})
Run Code Online (Sandbox Code Playgroud)
但现在我遇到了一个难题:我需要在我的Web应用程序中测试一个期望文件上传的视图,而我无法弄清楚WebOb如何代表特定类型的POST.有谁知道如何构建一个带有一个或多个文件上传字段的WebOb请求?