使用Launcher测试Google App Engine应用时,Launcher将启动本地服务器,并打开一个监听http://localhost:8080/
的标签页如果App.yaml文件配置为指向html文件,则网页将打开。就像你的主页是index.html
app.yaml档案
application: myProjectName
version: 2
runtime: python27
threadsafe: false
api_version: 1
handlers:
- url: .*
static_dir: index.html
如果app.yaml配置为指向根URL中的python脚本,我不知道如何让脚本加载网页:
app.yaml档案
- url: /.*
script: main.py
如果我的main.py
Python脚本是:
import webbrowser
webbrowser.open_new("README.html")
当我从Python Shell运行代码时,这将在我的浏览器中打开README.html文件,但如果我从Google App Engine Launcher启动应用程序,它将不会加载html文件。在Launcher在localhost:8000上启动应用程序后,如何让.py文件打开HTML文件?
我正在查看一个Google示例,我猜它使用的是WSGIApplication webapp。首先,Python代码通过授权过程,然后在脚本结束时,有以下代码:
# Create an WSGI application suitable for running on App Engine
application = webapp.WSGIApplication(
[('/', MainPage), ('/svc', ServiceHandler), ('/about', AboutHandler),
('/user', UserHandler)],
# XXX Set to False in production.
debug=True
)
def main():
"""Main entry point for executing a request with this handler."""
run_wsgi_app(application)
if __name__ == "__main__":
main()
我很感激任何对此有任何经验的人的反馈。
答案 0 :(得分:4)
我所知道的最简单的例子是hello world in the documentation:
# helloworld.py
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('Hello, World!')
application = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)
相应的app.yaml
是:
application: your-app-id
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
script: helloworld.application
您创建了一个类MainPage
- 每当您向localhost:8080/
发出请求时(请注意斜杠是不必要的),您将被定向到主页面。 application
负责将请求路由到适当的类,并为每个请求创建该类的新实例。它还调用get
或post
或任何HTTP方法。无论你写入响应是什么,都会以网页的形式返回到浏览器。
现在单页并不是那么有趣。也许你想要localhost:8080/goodbye
。然后你只需添加另一个类并将其“注册”到应用程序:
# helloworld.py
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('Hello, World!')
class GoodbyePage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('Goodbye, World. Time to sleep.')
application = webapp2.WSGIApplication([
('/', MainPage),
('/goodbye', GoodbyePage),
], debug=True)
此时无需更改app.yaml
。
如果您需要将所有页面保存在单个文件中,生活可能会有点令人沮丧。我们可以通过修改app.yaml
将其分解为2个(或更多)文件。
application: your-app-id
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /goodbye
script: goodbye.app
- url: /.*
script: helloworld.application
helloworld.py
与第一个示例相同。 goodbye.py
看起来像这样:
# goodbye.py
import webapp2
class GoodbyePage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
self.response.write('<html><head></head><body>Goodbye!</body></html>')
app = webapp2.WSGIApplication([
('/goodbye', GoodbyePage),
], debug=True)
app.yaml
中的网址是正则表达式 - 您希望将它们从最具体到最不具体的顺序排序(否则,您可能会使用错误的处理程序处理请求)。另请注意,当我们以这种方式进行设置时,app.yaml
中的约定为script: <module_name>.<variable_name>
。
答案 1 :(得分:3)
这是没有Jinja2的另一个例子。要使用Python提供HTML,您只需要这3个简单的东西。
1)使用webapp2 Python模块。
import webapp2
2)将您的HTML文件读入变量:
INDEX_HTML = open('index.html').read()
3)然后在发送某个URL时将其写出:
self.response.out.write(INDEX_HTML)
这是完整的Python脚本:
import cgi
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
INDEX_HTML = open('index.html').read()
self.response.out.write(INDEX_HTML)
class PageTwo(webapp2.RequestHandler):
def post(self):
self.response.write('<html><body>You wrote:<pre>')
self.response.write(cgi.escape(self.request.get('content')))
self.response.write('</pre></body></html>')
application = webapp2.WSGIApplication([
('/', MainPage),
('/sign', PageTwo),
], debug=True)
请注意,您的app.yaml配置需要正确,并且您需要一个HTML文件。 webapp2
模块提供了可以路由您的网址请求的RequestHandler
。 (显示不同的网页内容)这是一个GitHub存储库,其中包含代码,manifest app.yaml文件和index.html文件。
答案 2 :(得分:1)
这从文件中获取HTML,然后将其写入浏览器。这实际上更像是我在寻找的东西:
class MainPage(webapp2.RequestHandler):
def get(self):
template = JINJA_ENVIRONMENT.get_template('index.html')
self.response.write(template.render())
这是整个模块:
import cgi
import os
import jinja2
import webapp2
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
extensions=['jinja2.ext.autoescape'],
autoescape=True)
class MainPage(webapp2.RequestHandler):
def get(self):
template = JINJA_ENVIRONMENT.get_template('index.html')
self.response.write(template.render())
class PageTwo(webapp2.RequestHandler):
def post(self):
self.response.write('<html><body>You wrote:<pre>')
self.response.write(cgi.escape(self.request.get('content')))
self.response.write('</pre></body></html>')
application = webapp2.WSGIApplication([
('/', MainPage),
('/sign', PageTwo),
], debug=True)
以下是Git Hub存储库的链接: Get Template HTML, and write to browser
我在代码示例中看到了app.yaml配置文件的一个有趣变体:
- url: /
static_files: index.html
upload: index.html
即使webbapp2请求处理程序基于URL提供特定的HTML文件,app.yaml文件也会控制发送不同URL时会发生什么。 app.yaml文件可以配置为运行python脚本并上传特定的HTML文件。如果您的应用程序有很多子目录,并且在app.yaml文件结束之前不会加载main.py脚本,那么将app.yaml文件配置为预先加载静态HTML可能会导致主页面加载更快:
application: YourProjectNameHere
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
#Even though the main.py script also loads the index,
#this is faster if lots of processing
- url: /
static_files: index.html
upload: index.html
- url: /Client_Style
static_dir: Client_Style
- url: /Client_Pages
static_dir: Client_Pages
- url: /Client_Script
static_dir: Client_Script
- url: /Library
static_dir: Library
- url: /apiclient
static_dir: apiclient
- url: /Client_Data
static_dir: Client_Data
- url: /oauth2client
static_dir: oauth2client
- url: /uritemplate
static_dir: uritemplate
- url: /.*
script: main.application
libraries:
- name: webapp2
version: latest