我认为库中存在内存泄漏ndb但我无法找到.
有没有办法避免下面描述的问题?
您是否有更准确的测试想法来确定问题所在?
这就是我重现问题的方式:
我创建了一个包含2个文件的简约Google App Engine应用程序.
app.yaml:
application: myapplicationid
version: demo
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /.*
script: main.APP
libraries:
- name: webapp2
version: latest
Run Code Online (Sandbox Code Playgroud)
main.py:
# -*- coding: utf-8 -*-
"""Memory leak demo."""
from google.appengine.ext import ndb
import webapp2
class DummyModel(ndb.Model):
content = ndb.TextProperty()
class CreatePage(webapp2.RequestHandler):
def get(self):
value = str(102**100000)
entities = (DummyModel(content=value) for _ in xrange(100))
ndb.put_multi(entities)
class MainPage(webapp2.RequestHandler):
def get(self):
"""Use of `query().iter()` was suggested here:
https://code.google.com/p/googleappengine/issues/detail?id=9610 …Run Code Online (Sandbox Code Playgroud) python google-app-engine memory-leaks webapp2 app-engine-ndb
在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 文档使用
在我的python shell中,我可以做到
>>> import mimetypes
>>> mimetypes.guess_type("ulla.svg")
('image/svg+xml', None)
Run Code Online (Sandbox Code Playgroud)
并且它的行为符合预期,但是,在谷歌应用引擎上运行相同的代码(或至少,这个相同的例子),它返回 (None, None)
class TestHandler(webapp2.RequestHandler):
def get(self):
import mimetypes
self.response.out.write(mimetypes.guess_type("ulla.svg"))
Run Code Online (Sandbox Code Playgroud)
我做错了吗?:)
顺便说一句 - 在我的macbooks shell中它是python 2.7,在app-engine上也是2.7
我已经完成了python27和app引擎的入门:https://developers.google.com/appengine/docs/python/gettingstartedpython27/
在tut结束时,所有类都在同一个文件(helloworld.py)中,您和您配置路由器以指向文件底部的类的URL路径:
app = webapp2.WSGIApplication([('/', MainPage),
('/sign', Guestbook)],
debug=True)
Run Code Online (Sandbox Code Playgroud)
啧啧没有涉及的是我如何在我的应用程序增长时设置我的类/文件.例如,我将MainPage放在一个单独的文件中,然后在helloworld.py文件中调用'import MainPage'并将路由添加到WSGIApplication中吗?有没有比这更自动化的东西?我该怎么称呼MainPage文件?我应该在哪里存储它?
webapp2站点(http://webapp-improved.appspot.com/api/webapp2_extras/jinja2.html)有一个如何使用的教程webapp2_extras.jinja2,代码如下.
我的问题是:为什么缓存webapp2_extras.jinja2.Jinja2实例返回return jinja2.get_jinja2(app=self.app)?我检查了代码@webapp2.cached_property并发现它将Jinja2实例缓存在一个实例中BaseHandler,它会在请求后被销毁,所以为什么要费心去缓存呢?我在这里错过了什么吗?
import webapp2
from webapp2_extras import jinja2
class BaseHandler(webapp2.RequestHandler):
@webapp2.cached_property
def jinja2(self):
# Returns a Jinja2 renderer cached in the app registry.
return jinja2.get_jinja2(app=self.app)
def render_response(self, _template, **context):
# Renders a template and writes the result to the response.
rv = self.jinja2.render_template(_template, **context)
self.response.write(rv)
我试图在我的HTML中使用复选框,将这些复选框返回到我的python后端,然后如果单击该框,则递增三个计数器.
现在我的HTML如下,工作正常:
<form method="post">
<input type="checkbox inline" name="adjective" value="entertaining">Entertaining
<input type="checkbox inline" name="adjective" value="informative">Informative
<input type="checkbox inline" name="adjective" value="exceptional">Exceptional
</form>
Run Code Online (Sandbox Code Playgroud)
然后在我的python后端我有以下内容:
def post(self):
adjective = self.request.get('adjective ')
if adjective :
#somehow tell if the entertaining box was checked
#increment entertaining counter
#do the same for the others
Run Code Online (Sandbox Code Playgroud) 我正在编写一个Google App Engine webapp,它将一些HTML呈现给Django模板.我想要使用文件或只是一些非常类似于文件的json来渲染模板.是否可以使用Django将其呈现为读入并存储在数据库中的文件?旧的API.HTML只是api.html的旧版本,但有一些小的改动.将Django渲染到api-html文件可以正常工作.
我知道你不能在GAE上存储文件,我怎样才能动态地使用Django渲染到存储在内存中的HTML?
path = ""
oldAPI = APIVersion().get_by_key_name(version)
if oldAPI is None:
path = os.path.join(os.path.dirname(__file__), "api.html")
template_values = {
'responseDict': responseDict,
}
if path:
self.response.out.write(template.render(path, template_values))
else:
self.response.out.write(template.render(oldAPI.html,template_values))
Run Code Online (Sandbox Code Playgroud) 我可以使用Python工具for Visual Studio 2012 运行我的Google App Engine webapp2应用程序,无需遵循本教程,甚至单步执行服务器初始化代码,但是我无法在获取或发布方法时使用它来解决问题.网站已加载,类似于此视频中显示的main()方法.当我暂停调试器时,它总是在wsgi_server.py中的以下无限循环中结束:
def _loop_forever(self):
while True:
self._select()
def _select(self):
with self._lock:
fds = self._file_descriptors
fd_to_callback = self._file_descriptor_to_callback
if fds:
if _HAS_POLL:
# With 100 file descriptors, it is approximately 5x slower to
# recreate and reinitialize the Poll object on every call to _select
# rather reuse one. But the absolute cost of contruction,
# initialization and calling poll(0) is ~25us so code simplicity
# …Run Code Online (Sandbox Code Playgroud) 我的Google Cloud Endpoints API的客户端是一个JavaScript(AngularJS)Web应用程序,托管在与Endpoints API本身相同的Google App Engine应用程序上.我的用户使用webapp2会话(数据存储区)进行身份验证.他们不一定拥有Google帐户.我希望能够向Endpoints API发出请求,这样/api/users/me会返回当前登录用户的用户数据.
首先,我认为我必须为我的App Engine应用程序实现OAuth2提供程序,然后让AngularJS应用程序从我自己的App Engine OAuth提供程序(而不是Google的OAuth提供程序)请求OAuth2访问令牌,就像内置的身份验证机制一样).
但是,此评论建议不要实现我自己的OAuth2提供程序,而是在我的请求中(在消息字段中或在HTTP标头中)向Endpoints API提供任意参数.我猜这个参数应该是一个用户令牌(登录用户特有的一些加密值?).然后应将该值传递给浏览器.那不安全吗?如果可能,我不想在HTTPS上提供我的AngularJS应用程序(以节省成本).
这是OAuth2的一个很好的用例吗?或者OAuth2仅用于授予第三方应用程序访问用户数据的权限?
如果OAuth2不是这样的话:如何将用户令牌安全地传递给浏览器并防止中间人攻击?用户令牌是否应在一定时间后过期?
python google-app-engine oauth-2.0 webapp2 google-cloud-endpoints
在我的Web服务中,我重写了ExceptionHandler,但是我不清楚如何格式化异常以适应OData Error标准.也许我接近它错了,因为我在网上找不到任何例子.
根据我的理解,使用web api 2有一个全局异常处理的概念,您可以使用自定义ExceptionHandler来处理服务中引发的任何异常.仍然期望Exception使用新的IHttpActionResult()更新ExceptionContext.Result.如何格式化输入到IHttpActionResult的数据以格式化为OData错误.
下面是ExceptionHandler的一个片段,我坚持你将如何使用正确的OData HttpResponse消息覆盖context.Result.
public class CustomExceptionHandler: ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
HttpResponseMessage msg = context.Request.CreateErrorResponse(HttpStatusCode.NotFound, new ODataError
{
ErrorCode = context.Exception.Message,
Message = context.Exception.InnerException.Message,
InnerError = new ODataInnerError
{
Message = context.Exception.InnerException.Message
}
});
context.Result = //How do you wrap the OData HttpResponseMessage into a IHttpActionResult
}
}
Run Code Online (Sandbox Code Playgroud)
任何建议赞赏,谢谢,D