我陷入困境..我使用tipfy作为框架在scribd商店和blobstore上传文件.我的webform with action不是由blobstore.create_upload_url创建的(我只是使用url_for('myhandler')).我这样做是因为如果我使用blobstore处理程序解析了POST响应,我就不能使用普通的python-scribd api将文件上传到scribd store.现在我有工作的scribd saver:
class UploadScribdHandler(RequestHandler, BlobstoreUploadMixin):
def post(self):
uploaded_file = self.request.files.get('upload_file')
fname = uploaded_file.filename.strip()
try:
self.post_to_scribd(uploaded_file, fname)
except Exception, e:
# ... get the exception message and do something with it
msg = e.message
# ...
# reset the stream to zero (beginning) so the file can be read again
uploaded_file.seek(0)
#removed try-except to see debug info in browser window
# Create the file
file_name = files.blobstore.create(_blobinfo_uploaded_filename=fname)
# Open the file and write to it
with files.open(file_name, …Run Code Online (Sandbox Code Playgroud) 我有一个具有"私有"REST API的应用程序; 从我自己的网页进行Ajax调用时,我使用RESTful URL.但是,这是不安全的,如果他们知道URL模式,任何人都可以进行相同的调用.
保护这些电话的最佳(或标准)方法是什么?如果我打算在将来发布API,或者我将两个单独的策略混合在一起,是否值得看看OAuth之类的东西?
我正在使用Google App Engine for Python和Tipfy.
你在谷歌应用引擎上使用哪一个?
你决定背后的原因是什么?
我正在开发我的应用程序的身份验证部分,我遇到了使用OpenID编码身份验证的问题.
我查看了Tipfy示例代码,但似乎是在OpenID提供程序硬编码为google的假设下编写的.
我希望用户能够提供他们想要的任何OpenID(这不是重点吗?).
有没有人有任何示例代码显示用户使用用户提供的OpenID登录?
我现在正在python中做一些项目,我正在试图弄清楚如何使用我自己版本的现有开源软件包.
例如,我正在使用tipcy和zc.buildout,我已经添加了'paypal'包.不幸的是它没有我需要的功能,所以我在github上分叉并添加了该功能.我将向原始软件包维护者发送一个pull请求,但是他们是否接受我的添加,我想使用我的软件包版本并保持zc.buildout管理我的依赖项的便利性.我该怎么做呢?
我是否将我自己的库上传到PyPI并用我的名字加上前缀?这不会不必要地污染指数吗?
或者我应该制作和维护自己的索引和包装回购?我在哪里可以找到这种格式?是否违反OSS许可条款以使用相同名称的修改包托管我自己的仓库?(我宁愿不用新的命名空间修改项目中的每个文件)
我确定这个问题出现了很多,而不仅仅是python.我可以看到Maven和SBT也发生这种情况......当人们想要使用他们自己版本的流行软件包时,他们通常会做些什么?
我试图模仿http://tipfy-auth.appspot.com示例中的登录页面(来源http://code.google.com/p/tipfy/source/browse/examples/auth/app/)没有成功.当用户被重定向回页面时,我似乎遇到了问题.当前请求流程如下:
LoginPage(LoginHandler) - > Facebook redirect(FacebookAuthHandler)302 - > Facebook.com - > Facebook redirect(FacebookAuthHandler)302 - > SignupPage(SignupHandler)302 - > LoginPage(LoginHandler).
这里的问题(据我所知)是从注册(应该是端点)到登录页面的最后302(http重定向).
经过一些激烈的日志记录(无法找到本地测试),似乎从facebook返回时会设置一个会话.会话FacebookAuthHandler在两个地方self.auth.session(dict)和self.session(a SecureCookieSession)中作为dict存储在请求handler()上,但在重定向到SignupPage之后self.auth.session是None.
从SignUpPage到LoginPage的重定向发生是因为SignupHandlerget方法有一个装饰器@login_required,self.auth.session用于确定是否应该在此处理或重定向reuquest.
那么为什么self.auth.session不能保留在请求之间而self.session是什么?self.auth.session每个请求都设置好吗?如何存储会话?如果它在数据库中,则数据存储区类型是否重要(主/从或高复制).
我正在挖掘源代码,但找不到任何有用的东西.
..fredrik
编辑
发表以下答案.
我有一个jinja模板,带有通常的样板链接,其中一个是"退出"链接.在呈现页面之前,必须使用Users.create_logout_url()生成此链接的URL.
我想避免生成此URL并将其添加到每个get/post处理程序的render_response中.我已经研究过替代品,但还没有找到一种功能性的方法来解决这个问题.
BaseRequestHandler
这似乎是最干净的方法,但我不确定如何去做.会不会是这样的
self.vars['logout_link'] = users.create_logout_url(self.request.path))
Run Code Online (Sandbox Code Playgroud)
..然后,在所有标准响应处理程序中:
return render_response('template.html', **vars)
Run Code Online (Sandbox Code Playgroud)
?
装饰
这似乎是另一种选择,虽然看起来有点凌乱.我想它可以以相同的方式工作(将logout链接分配给包装函数中的局部变量).
上下文处理?
我正在使用tipfy/jinja,据我所知,这似乎不支持这个.
有什么建议我应该进一步调查吗?
谢谢
我有一个BaseHandler类,它在我的AppEngine站点中继承了Tipfy RequestHandler.在其中,我为移动设备设置了一个"穷人"浏览器嗅探器,其中包含一个包含设备名称的类属性(元组).
在后续方法中,我遍历元组中的设备名称,并根据Request对象中的用户代理字符串检查它们.如果我得到匹配,我将名为"is_mobile"的实例属性设置为True.
但是,在那个方法中,Python给了我一个"TypeError:类型'UserAgent'的参数不可迭代"错误,我无法理解为什么,因为它所抱怨的行不是(据我所知)一个循环.
这是代码:
class BaseHandler(RequestHandler, AppEngineAuthMixin, AllSessionMixins):
mobile_devices = ('Android', 'iPhone', 'iPod', 'Blackberry')
....
def detect_mobile_devices(self):
found_device = False
for device in self.__class__.mobile_devices:
if device in self.request.user_agent:
found_device = True
break
self.is_mobile = found_device
Run Code Online (Sandbox Code Playgroud)
这是Python不喜欢的行:
File "/path/to/project/app/apps/remember_things/handlers.py", line 56, in detect_mobile_devices
if device in self.request.user_agent:
Run Code Online (Sandbox Code Playgroud)