Python添加额外属性以使Flask读取webapp2

问题描述 投票:1回答:2

所以我已经使用Google App Engine Webapp2多年了。现在不推荐使用Python 2,而Webapp2仅适用于Python2。我使用的所有类都旨在由webapp2解释。我没有尝试通过将页面的所有类更改为Flask来更改数万行代码,而是在进行一个简单的修复。我只需要在类说出self.response.write(“无论您写什么”)时编译所有内容并将其返回到flask即可使用。我遇到的问题是添加.write()我只能做self.response(“ whatever add”),但我不知道如何使self.response.write(“ whatever”)工作。任何有关如何添加.write()并使之工作的建议将不胜感激。这是到目前为止我所做的事情,这段代码很好用,但是我仍然需要添加.write()。

from flask import Flask
from flask import request

app = Flask(__name__)

class BaseHandler():
  def __init__(self):
    self.data = ""
  def response(self,stuffAdd):
    self.data+=stuffAdd

class MainPage(BaseHandler):
    def get(self):
        self.response("first thing to add")
        self.response("second thing to add")

@app.route('/',methods=['GET'])
def hello_world():
    if request.method == 'GET':
        newMain=MainPage()
        newMain.get()
        return newMain.data
python google-app-engine flask attributes webapp2
2个回答
1
投票

我认为这将满足您的要求:

class Response:
    def __init__(self, handler):
        self.handler = handler

    def __call__(self, stuffAdd):
        self.handler.data += stuffAdd

    def write(self, arg):
        # You can do whatever you want here
        whatever_you_want(self.handler, arg)

class BaseHandler:
    def __init__(self):
        self.data = ""
        self.response = Response(self)

[Response是可调用的类,这意味着您可以像调用函数一样调用该类的实例,在这种情况下,将调用__call__方法。

我只是将存根whatever_you_want(handler, arg)用作write,但是显然您可以在其中做任何您想做的事情。


0
投票

感谢Tom,现在可以使用了。如果有人试图将旧的Webapp2类转换为Flask,则这是使其工作的最终代码。稍后,我还将添加一种方法来管理webapp2会话并发布请求。稍后,我将对此进行更新,以供其他所有人希望使其旧的webapp2项目与python 3一起使用。

from flask import Flask
from flask import request

app = Flask(__name__)

class Response:
    def __init__(self, handler):
        self.handler = handler

    def __call__(self, stuffAdd):
        self.handler.data += stuffAdd

    def write(self, stuffAdd):
        self.handler.data += stuffAdd

class BaseHandler:
    def __init__(self):
        self.data = ""
        self.response = Response(self)

class MainPage(BaseHandler):
    def get(self):
        self.response.write("first thing to add")
        self.response.write("second thing to add to the stuff")

@app.route('/',methods=['GET'])
def hello_world():
    if request.method == 'GET':
        newMain=MainPage()
        newMain.get()
        return newMain.data

© www.soinside.com 2019 - 2024. All rights reserved.