app.yaml和服务器设计中的问题

时间:2012-06-21 17:48:31

标签: python django google-app-engine yaml

我需要在此服务器中提供一些基本功能:

  1. 使用<显示一个漂亮的主屏幕(html)选择>小部件和2个按钮(一个用于选择从高清上传图像和另一个用于发送的图像)+用于输入消息的TextEditBox
  2. 当用户点击“发送”时 - 从选择小部件和
  3. 中选择用户
  4. 图片将上传
  5. 我已经成功地分别实现了所有这些,现在当我开始一起工作时,由于设计糟糕,app.yaml url路径出现了问题。

    app.yaml看起来像:

    runtime: python    
    
    handlers:
    - url: /(.+)
      static_files: images/\1
      upload: images/(.*)
    
    - url: /.*
      script: kserver.py
    

    kserver.py:

    class StartPage(webapp.RequestHandler):
        def get(self):
            select_items = db.GqlQuery( "SELECT * FROM Registration" )
            upload_url = blobstore.create_upload_url('/upload')
            self.response.out.write(template.render("tst.html", {'select_items': select_items}))
    
    class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
        def post(self):
            upload_files = self.get_uploads('file')
            image = self.request.get("img")
            photo = Photo()
            photo.imageblob = db.Blob(image)
            photo.put()
            blob_info = upload_files[0]
            self.redirect('/serve/%s' % blob_info.key())
    
    class DownloadImage(webapp.RequestHandler):
        def get(self):
            photo= db.get(self.request.get("photo_id"))
            if photo:
                self.response.headers['Content-Type'] = "image/jpeg"
                self.response.out.write(photo.imageblob)
            else:
                self.response.out.write("Image not available")
    
    class Sender(webapp.RequestHandler):
        def post(self):
            ...
            ...
            self.response.headers['Content-Type'] = 'text/html'     # reply with 200 OK
            self.response.set_status( 200,"OK" )
            ...
            ...
    
    class TokenService(webapp.RequestHandler):
        def post(self):
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.set_status( 200,"Registration accepted" )
            ...
    
    application = webapp.WSGIApplication([('/', StartPage),
                                          ('/sender',Sender),
                                          ('/upload', UploadHandler),
                                          ('/i', DownloadImage),
                                          ('/serve/([^/]+)?', ServeHandler),
                                          ('/token',TokenService)],
                                          debug=True)
    def main():
        run_wsgi_app(application)
    
    if __name__ == "__main__":
        main()
    

    这是tst.html:

    <html>
        <body>
            <select name="accountName">
                <option value=\"ALL\">ALL</option>
                {% for item in select_items %}
            <option value="{{ item.accountName }}">{{ item.accountName }}</option>
                {% endfor %}
            </select>
            <form action="sender" method="POST">
                <input  type="text" id="TextEditBox_1">
                <input  type="submit" name="submit">
                <input  type="file" name="img" id="Choose_file">
            </form>
        </body>
    </html>
    

    注意,识别是好的,它只是代码的一部分。

    在项目中,我有一个图像目录,其中包含app.ico和背景图像(静态)

    好的,现在问题是我进入GAE日志:

    Static file referenced by handler not found: images/token
    Static file referenced by handler not found: images/sender
    

    这不是故意的。它应该在'/'我认为

    "/token 404 48ms 0kb            No handlers matched this URL."
    

    此外,当点击“发送”时,它会将我重定向到一个新页面:

    The requested URL /sender was not found on this server.
    

    这个/ token是来自外部的POST来注册到服务器 - 服务器而不是db中的商店注册。当按下“发送”按钮时,它应该使用这个db.register标记。

    对此主题的任何评论都是最受欢迎的。感谢名单!

2 个答案:

答案 0 :(得分:5)

app.yaml中的模式过于笼统:

- url: /(.+)
  static_files: images/\1
  upload: images/(.*)

几乎可以匹配任何东西,因此代码处理的请求永远不会到达那里。尝试这样的事情:

- url: /(.*\.(gif|png|jpg))
  static_files: static/\1
  upload: static/(.*\.(gif|png|jpg))

仅处理以gif,png或jpg结尾的文件。

答案 1 :(得分:4)

你的第一个处理程序匹配第一个斜杠后至少有一个字符的任何东西;你需要使用像/images/.*这样的网址,或者只匹配以(jpg|gif|png|ico)结尾的文件,例如