原始问题
App Engine SDK 1.6.5
Python 2.7
webapp2
我已经实现了webapp2方案来保护页面到https.问题是,当用户说http:// site/login而不是https:// site/login时,由于方案无法识别路由,因此会出现404错误.
示例main.py
# Libraries
import webapp2
# Local Controllers
from controllers.HomeHandler import HomeHandler
from controllers.LoginHandler import LoginHandler
app = webapp2.WSGIApplication([
webapp2.Route(r'/', HomeHandler),
webapp2.Route(r'/login', LoginHandler, schemes=['https'], name='login')
], debug=True)
Run Code Online (Sandbox Code Playgroud)
我在https路由下面添加了另一个路由/控制器来捕获http请求:
webapp2.Route(r'/login', RouteLogin)
RouteLogin.py
# Libraries
import webapp2
class RouteLogin(webapp2.RequestHandler):
def get(self):
self.redirect('https://site.appspot.com/login')
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎应该有更好的方法来做到这一点.就像在Apache Web服务器上使用htaccess一样.这对我喜欢的黑客来说太像了.我真的不喜欢我的代码中的硬编码URL.更不用说登录的2个请求并不是什么大不了的事,但可能还有其他一些例子,它最终导致成本太高.
注意1:如果您正在查看此解决方案,请注意使用HTTPS方案还意味着您将无法在不删除SCHEME或配置为dev设置的变量的情况下使用开发控制台.
注意2:我能够以编程方式提供HTTPS而不是HTTP.我在正确的轨道上有下面的评论,但它需要一个参数.
webapp2.uri_for('login', _scheme='https')
这将为您提供正确的https://someapp.appspot.com/login网址.遗憾的是,我没有处理我的主要问题,如何处理人们在没有https的情况下在地址栏中键入url并收到错误,除非我使用上面的hack.所以我仍然在寻找WSGI方式将收入请求路由到HTPPS.
编辑:添加了注释1并澄清了标题,我认为很明显我是从源代码而不是CGI使用WSGI.
我试图从app.yaml传递一些配置变量到我的main.py. 我无法找到从代码中访问app.yaml的语法.
例如,您希望用户将其客户端号码放在app.yaml中,并从main.py访问它以传递到main.html.虽然在main.py中创建一个变量来传递它很容易,但它似乎更适合放入app.yaml.
例:
的app.yaml
application: xyz
version: 1
runtime: python27
...
clientID: (ID here)
Run Code Online (Sandbox Code Playgroud)
main.py
myID = appYAML.clientID
...
values = {'xyz': blah.blah, 'myID': myID }
Run Code Online (Sandbox Code Playgroud)
main.html中
...
<script>
...
{% ifequal myID %}
my_client = {{myID}}
...
</script>
Run Code Online (Sandbox Code Playgroud) The following code is close to what I am using without getting too long. I get the error TypeError: is_valid() takes exactly 2 arguments (3 given). To my eyes I am only passing 2 arguments. So where is the third argument coming from?
models/MyModel.py
from google.appengine.ext import db
class MyModel(db.model):
a = db.StringProperty(required=True)
b = db.StringProperty(required=True)
c = db.StringProperty(required=True)
class Update:
def is_valid(x, y)
myquery = db.GqlQuery('SELECT * FROM Valid WHERE value = :1' x)
v = myquery.get()
if …Run Code Online (Sandbox Code Playgroud)