<https://cloud.google.com/appengine/docs/standard/python/blobstore?hl=ja>

上記のチュートリアルをやっているのですが、うまくいきません。  
ソースコードは変更なしでそのままです。

```

    from google.appengine.api import users
    from google.appengine.ext import blobstore
    from google.appengine.ext import ndb
    from google.appengine.ext.webapp import blobstore_handlers
    import webapp2
    
    # This datastore model keeps track of which users uploaded which photos.
    class UserPhoto(ndb.Model):
        user = ndb.StringProperty()
        blob_key = ndb.BlobKeyProperty()
    
    class PhotoUploadFormHandler(webapp2.RequestHandler):
        def get(self):
            upload_url = blobstore.create_upload_url('/upload_photo')
            # To upload files to the blobstore, the request method must be "POST"
            # and enctype must be set to "multipart/form-data".
            self.response.out.write("""
    <html><body>
    <form action="{0}" method="POST" enctype="multipart/form-data">
      Upload File: <input type="file" name="file"><br>
      <input type="submit" name="submit" value="Submit">
    </form>
    </body></html>""".format(upload_url))
    
    class PhotoUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
        def post(self):
            upload = self.get_uploads()[0]
            user_photo = UserPhoto(
                user=users.get_current_user().user_id(),
                blob_key=upload.key())
            user_photo.put()
    
            self.redirect('/view_photo/%s' % upload.key())
    
    class ViewPhotoHandler(blobstore_handlers.BlobstoreDownloadHandler):
        def get(self, photo_key):
            if not blobstore.get(photo_key):
                self.error(404)
            else:
                self.send_blob(photo_key)
    
    app = webapp2.WSGIApplication([
        ('/', PhotoUploadFormHandler),
        ('/upload_photo', PhotoUploadHandler),
        ('/view_photo/([^/]+)?', ViewPhotoHandler),
    ], debug=True)
    
```

デプロイして実行すると、フォームのHTMLは表示されるのですが（create_upload_urlでのURLの取得もうまくいっている）、ファイルを選択してsubmitすると、403エラーが返ってきてしまいます。

なぜでしょうか？  
１つチュートリアルと違う部分は、App EngineにIP制限をしていますが、関係なさそうです。（一応127.0.0.1やApp
Engine自体のIPも許可してみたのですが変わらずでした）
CC BY-SA 4.0
2020-03-24T15:24:38.987
64088
2020-04-06T07:32:15.863
25616
question
python google-app-engine google-cloud-storage
Blobstore Python API のチュートリアルがうまくいかない
> １つチュートリアルと違う部分は、App EngineにIP制限をしていますが、関係なさそうです。（一応127.0.0.1やApp
> Engine自体のIPも許可してみたのですが変わらずでした）

関係なさそうと書いておきながら、こちらが原因でした。

<https://cloud.google.com/appengine/docs/standard/python/creating-
firewalls?hl=ja>  
上記に記載のIPを許可することで解決しました。
CC BY-SA 4.0
2020-04-06T07:32:15.863
65393
2020-04-06T07:32:15.863
25616
64088
answer