0

我正在尝试使用 Google App Engine 创建一个简单的 Web 应用程序。我使用 jinja2 渲染前端 html 文件。用户输入他们的 AWS 凭证并获取区域的输出并与它们连接虚拟机。我有一个控制器文件,我向其中导入了一个模型文件,它看起来像这样:

import webapp2
import jinja2
import os
import model

jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))


class MainPage(webapp2.RequestHandler):
    def get(self):       
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render())

    def request_a(self):
        a = self.reguest.get('a')
        return a

    def request_b(self):
        b = self.reguest.get('b')
        return b

class Responce(webapp2.RequestHandler):      
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write(testing_ec2.me.get_machines())


app = webapp2.WSGIApplication([('/2', MainPage), ('/responce', Responce)], debug=True)

然后我有一个模型文件,我将控制器文件导入到该文件中,它看起来像这样:

import boto.ec2
import controller
import sys

if not boto.config.has_section('Boto'):
    boto.config.add_section('Boto')
boto.config.set('Boto', 'https_validate_certificates', 'False')



a = controller.MainPage.get()
b = controller.MainPage.get()



class VM(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.regions = boto.ec2.regions(aws_access_key_id = a, aws_secret_access_key = b)

    def get_machines(self):
        self.region_to_instance = {}#dictionary, which matches regions and instances for this region
        for region in self.regions:
            conn = region.connect(aws_access_key_id = self.a, aws_secret_access_key = self.b)
            reservations = conn.get_all_instances()#get reservations(need understand them better)
            if len(reservations) > 0:#if there are reservations in this region
                self.instances = [i for r in reservations for i in r.instances]#creates a list of instances for that region
                self.region_to_instance[region.name] = self.instances
        return self.region_to_instance

me = VM(a, b)
me.get_machines()

当我运行它时,它会抛出一个错误:类型对象'MainPage'没有属性'request_a'我假设它发生了,因为我没有调用 MainPage 类的实例,而是调用了一个类本身。什么是 MainPage(及其父 webapp.RequestHandler)类的实例?如何在另一个模块中调用它?

4

1 回答 1

0

你的代码对我来说看起来很奇怪。我不明白你的编码习惯。

一般的答案是:如果你喜欢使用 MainPage 的方法,你可以使用继承。

但。如果我了解您的代码的目标。为什么不从您的响应课程中调用 boto。但是,在这里你使用了一个 get,你应该使用一个帖子,因为你发布了一个带有 AWS 凭证的表单。

所以我建议:

  1. 使用 get 和 post 方法创建一个 MainPage 来处理表单

  2. 在 post 方法中发出 boto 请求并将结果与​​ jinja 一起发送给用户。

另请参阅 GAE Python27 入门和处理表单: https ://developers.google.com/appengine/docs/python/gettingstartedpython27/handlingforms?hl=nl

于 2013-06-14T18:51:58.560 回答