0

このサーバーにいくつかの基本的な機能を実装する必要があります。

  1. <select>ウィジェットと2つのボタン(1つはHDからアップロードする画像を選択し、もう1つは送信する)+メッセージを入力するためのTextEditBoxを備えた素敵なメイン画面(html)を表示します
  2. ユーザーが「送信」をクリックしたとき-選択ウィジェットからユーザーの選択を取得し、
  3. 画像がアップロードされます

私はそれをすべて個別に実装することができましたが、すべてを一緒に機能させるようになると、デザインが悪いために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とbackgroung image(statics)を含むimagesディレクトリがあります。

さて、今問題は私が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トークンを使用する必要があります。

この件に関するコメントは大歓迎です。ありがとう!

4

2 に答える 2

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で終わるファイルのみを処理します。

于 2012-06-21T17:59:33.077 に答える
4

最初のハンドラーは、最初のスラッシュの後に少なくとも1文字の文字と一致します。/images/.*のようなURLを使用するか、で終わるファイルのみに一致させる必要があります。(jpg|gif|png|ico)例:

于 2012-06-21T17:52:55.977 に答える