我现在将我的小型Google App Engine应用程序迁移到Heroku平台.我实际上并没有使用Bigtable,并且webapp2大大降低了我的迁移成本.
现在我一直坚持处理静态文件.
有没有好的做法?如果是的话,请带我到那里.
提前致谢.
编辑
好吧,我现在正在使用paste我的WSGI服务器.而且paste.StaticURLParser()应该是什么我需要实现静态文件处理程序.但是我不知道如何将它与它集成webapp2.WSGIApplication().谁能帮助我?
也许我需要覆盖webapp2.RequestHandler类才能paste.StaticURLParser()正确加载;
import os
import webapp2
from paste import httpserver
class StaticFileHandler(webapp2.RequestHandler):
u"""Static file handler"""
def __init__(self):
# I guess I need to override something here to load
# `paste.StaticURLParser()` properly.
pass
app = webapp2.WSGIApplication([(r'/static', StaticFileHandler)], debug=True)
def main():
port = int(os.environ.get('PORT', 5000))
httpserver.serve(app, host='0.0.0.0', port=port)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
以下是我拥有的简单数据库模型:
class Notes(db.Model):
text = db.StringProperty(multiline=True)
date = db.DateTimeProperty(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
现在在url处理程序中,我将所有注释发送到模板,如下所示:
class MainPage(webapp2.RequestHandler):
def get(self):
notes = Notes.all()
self.render_template("index.html", {'notes':notes})
Run Code Online (Sandbox Code Playgroud)
在我使用jinja2模板引擎的模板中,我希望id打印每个音符,以便我可以嵌入编辑链接,有点像这样:
{% for note in notes %}
<p>
{{ note.text }} <br>
{{ note.date }} <br>
(<a href ="edit/{{note.key.id}}">edit </a>)
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
但麻烦的是,我没有看到任何打印,代替note.key.id
按照此处 的文档,key类代表数据库实体的唯一键id,它有一个方法,它是一个数值.对于我想要的音符集的单个id音符.
如果我使用django模板引擎我得到{{ notes.key.id }}打印的值,但jinja2我没有看到它.
我怎样才能做到这一点?
我有继承自基本模板的 jinja 模板。只是简单的扩展。
例如,在setting.html中:
{% extends "templates/base.html" %}
Run Code Online (Sandbox Code Playgroud)
但这会绊倒聚合物的硫化机,它不理解继承性。那么,有没有办法首先“展平”我的setting.html,即将base.html 拉入setting.html,而不评估变量?
我查看了jinja 的模板 api,但不太清楚什么 api 可以做到这一点?唯一看起来很接近的可能是compile_templates()?但再次从文档中并不清楚这到底是做什么的。
compile_templates(target, extensions=None, filter_func=None, zip='deflated', log_function=None, ignore_errors=True, py_compile=False)
Run Code Online (Sandbox Code Playgroud) 我试图捕获函数调用内引发的特定类型的异常。我将函数调用包含在 try/ except 块内,其中 except 块捕获抛出的特定异常。我仍然会获得该异常的系统失败堆栈跟踪,除非我还包含所有异常的常规捕获。在包含该块并检查所捕获的异常的类型时,我发现它正在捕获我想在第一个块中捕获的异常类型。不知道为什么会发生这种情况。
上下文:使用 webapp2 和 ndb 开发 Google 应用程序引擎应用程序。文件函数有一个init .py,它从 exceptions.py 导入所有异常
模拟代码和结构
utils/函数/Exceptions.py
"""
Custom exception types
"""
class InvalidParamsException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return repr(self.msg)
Run Code Online (Sandbox Code Playgroud)
模型/models.py
import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
import utils.functions as func
<-->
class ModelClass(ndb.Model):
@classmethod
def new(cls):
<-->
raise func.InvalidParamsException("Invalid Params to function!")
<-->
Run Code Online (Sandbox Code Playgroud)
路线.py
import utils.functions as func
from models import ModelClass
class ModelClassHandler(webapp2.RequestHandler):
def post(self):
try:
new_model = ModelClass.new()
except func.InvalidParamsException as e: …Run Code Online (Sandbox Code Playgroud) 我想将以下 XML 文档发送到我的 Web Api 2 控制器;但是,该[FromBody]参数始终为空。
这是请求 XML 正文:
<razorInbound server="PortfolioExposureServer" request="lookupRiskPointRecord">
<caller>RazorClient</caller>
<responseMode>xml</responseMode>
<body>
<conditions>
<fromOffset>0</fromOffset>
<top>100</top>
<condition>
<keyPath>
<keyElement nodeOffset='1'>Currency</keyElement>
<keyElement nodeOffset='2'>ID</keyElement>
</keyPath>
<lookupValue>USD</lookupValue>
</condition>
</conditions>
</body>
</razorInbound>Run Code Online (Sandbox Code Playgroud)
使用Postman发送请求,如下:
POST /api/razorXmlRequest HTTP/1.1
Host: localhost:5000
Content-Type: application/xml
Cache-Control: no-cache
Postman-Token: 6ca91ebf-31e0-77f2-6f81-cb9993b69b1a
<razorInbound server="PortfolioExposureServer" request="lookupRiskPointRecord">
<caller>RazorClient</caller>
<responseMode>xml</responseMode>
<body>
<conditions>
<fromOffset>0</fromOffset>
<top>100</top>
<condition>
<keyPath>
<keyElement nodeOffset='1'>Currency</keyElement>
<keyElement nodeOffset='2'>ID</keyElement>
</keyPath>
<lookupValue>USD</lookupValue>
</condition>
</conditions>
</body>
</razorInbound>Run Code Online (Sandbox Code Playgroud)
和 Web Api 2 控制器:
注意:该param参数始终为null
我相信我需要一个正确的类定义来正确映射 XML 请求,但我不确定如何构造它。
using System; …Run Code Online (Sandbox Code Playgroud)我有一个使用 webapp2 框架的 Google App Engine 应用程序,它与 MySQL 数据库交互。应用程序的用户可以上传数据。在上传过程中,我想显示一个进度条,因为它可能需要几分钟。
根据我所看到的其他主题(主要是:这个题目和这一次),我工作的一个JSON / JavaScript的解决方案,这都是新的我。
如果我传递一个随机数,进度条本身正在工作。但是,我无法弄清楚如何从 Python 脚本“加载”不断变化的值。
这是 HTML/CSS/Javascript:
HTML:
<div id="myProgress">
<div id="myBar"</div>
</div>
CSS:
#myProgress {width: 300px;
height: 30px;
background-color: #ddd;
}
#myBar {width: 1%;
height: 30px;
background-color: #4CAF50;
}
Javascript:
<script type="text/javascript">
function move() {
var elem = document.getElementById("myBar");
var width = 1;
var id = setInterval(frame, 1000);
function frame() {
if (width >= 100) {
clearInterval(id);
}
else {
//var randomnumber = Math.floor(Math.random() * …Run Code Online (Sandbox Code Playgroud) 我的应用程序应该接受这样的URI:
/poll/abc-123
/poll/abc-123/
/poll/abc-123/vote/ # post new vote
/poll/abc-123/vote/456 # view/update a vote
Run Code Online (Sandbox Code Playgroud)
民意调查可以选择组织成类别,因此上述所有内容也应该如下:
/mycategory/poll/abc-123
/mycategory/poll/abc-123/
/mycategory/poll/abc-123/vote/
/mycategory/poll/abc-123/vote/456
Run Code Online (Sandbox Code Playgroud)
我的配置错误:
app = webapp2.WSGIApplication([
webapp2.Route('/<category>/poll/<poll_id><:/?>', PollHandler),
webapp2.Route('/<category>/poll/<poll_id>/vote/<vote_id>', VoteHandler),
], debug=True)
Run Code Online (Sandbox Code Playgroud)
问题:如何修复配置?
如果可能,应针对GAE CPU时间/托管费进行优化.例如,如果我为每个条目添加两行可能会更快:一行包含类别,另一行没有类别...
我希望我的id为<999999999,但现在尝试编程它似乎有相反的效果,我只是让id更大,当我尝试分配id开始>结束?
start, end = User.allocate_ids(max=999999999)
logging.info('start %d' % start)
logging.info('end %d' % end)
lower = start if start < end else end
key = User(id=lower).put()
logging.info('key: '+str(key))
user = key.get()
user.add_auth_id(email)
Run Code Online (Sandbox Code Playgroud)
我的日志输出显示分配的ID错误:
2012-02-13 03:19:07.396 start 98765439124
I 2012-02-13 03:19:07.396 end 98765439123
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我最终使用的脏的解决方法是制作一种自己的ID系统,我不应该这样做,但它是这种情况下唯一的解决方案,我不认为这会产生冲突或重复,如果实体开始填充,它可能会很慢up,但是现在这似乎是一个对用户可接受的解决方案,虽然看起来可能看起来不那么好看代码:
new_id = random.randint(1,999999999)
logging.info('testing new id: %d' % new_id)
while User.get_by_id(new_id) != None:
new_id = random.randint(1,999999999)
logging.info('creating new id: %d' % new_id)
key = User(id=new_id).put()
Run Code Online (Sandbox Code Playgroud) python google-app-engine python-2.7 webapp2 google-cloud-datastore
我正在将webapp2 auth实现到我的代码库中,并希望了解这个怪癖:
在models.py中,我看到它表明:
为了在创建新属性时确保属性唯一性
User,我们首先Unique为这些属性创建 记录,如果一切顺利,我们可以保存新User记录::
对我来说,这似乎是一种非常复杂的测试唯一性的方法,说实话,我并不完全理解"create_multi"函数正在做什么......这可能就是为什么我在这里有点困惑.我的思考过程是:
只需快速查询以查看数据存储区中是否存在用户名(auth.id).如果没有那么put().
我知道我错过了什么,有人可以向我解释一下吗?我有一种预感,也许代码是在那里输入的,这样,如果人们想要,有多个唯一身份就很容易?
谢谢!
ps显然,webapp2代码的灵感来自于这段编码.
我从一个Java REST背景来Python上Google App Engine's.我需要一些使用webapp2路径参数的帮助.下面是Java如何读取请求的示例.有人请将代码翻译成python如何阅读它webapp2?
// URL: my_dogs/user_id/{user_id}/dog_name/{a_name}/breed/{breed}/{weight}
@Path("my_dogs/user_id/{user_id}/dog_name/{a_name}/breed/{breed}/{weight}")
public Response getMyDog(
@PathParam("user_id") Integer id,
@PathParam("a_name") String name,
@PathParam("breed") String breed,
@PathParam("weight") String weight
){
//the variables are: id, name, breed, weight.
///use them somehow
}
Run Code Online (Sandbox Code Playgroud)
我已经走了过来例子在谷歌(https://developers.google.com/appengine/docs/python/gettingstartedpython27/usingwebapp).但我不知道如何扩展简单
app = webapp2.WSGIApplication([('/', MainPage),
('/sign', Guestbook)],
debug=True)
Run Code Online (Sandbox Code Playgroud) webapp2 ×10
python ×5
python-2.7 ×3
jinja2 ×2
heroku ×1
html ×1
inheritance ×1
javascript ×1
json ×1
static-files ×1
vulcanize ×1