このサーバーにいくつかの基本的な機能を実装する必要があります。
- <select>ウィジェットと2つのボタン(1つはHDからアップロードする画像を選択し、もう1つは送信する)+メッセージを入力するためのTextEditBoxを備えた素敵なメイン画面(html)を表示します
- ユーザーが「送信」をクリックしたとき-選択ウィジェットからユーザーの選択を取得し、
- 画像がアップロードされます
私はそれをすべて個別に実装することができましたが、すべてを一緒に機能させるようになると、デザインが悪いために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トークンを使用する必要があります。
この件に関するコメントは大歓迎です。ありがとう!