App Engine - Python - 从脚本打开本地HTML文件

时间:2014-01-08 06:28:09

标签: python google-app-engine wsgi

使用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()

我很感激任何对此有任何经验的人的反馈。

3 个答案:

答案 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负责将请求路由到适当的类,并为每个请求创建该类的新实例。它还调用getpost或任何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文件。

Serve HTML with Python

答案 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