Python Добавьте дополнительный атрибут, чтобы Flask прочитал webapp2 - PullRequest
2 голосов
/ 08 марта 2020

Так что я уже давно использую Google App Engine Webapp2. Теперь Python 2 устарела, а Webapp2 работает только для Python 2. Все мои классы предназначены для интерпретации webapp2. Вместо того, чтобы пытаться изменить десятки тысяч строк кода, изменив все классы для страниц на Flask, я работаю над простым исправлением. Мне просто нужно, когда класс говорит self.response.write («что бы вы ни писали»), чтобы скомпилировать все это и вернуть его для работы с flask. Проблема, с которой я сталкиваюсь, заключается в добавлении .write (), я могу сделать просто self.response («что угодно добавить»), но я не могу понять, как заставить self.response.write («что угодно») работать. Будем весьма благодарны за любые советы о том, как добавить .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

Ответы [ 2 ]

3 голосов
/ 08 марта 2020

Я думаю, что это будет делать то, что вы хотите:

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(self.handler, arg) для write, но вы, очевидно, можете делать там все, что хотите.

0 голосов
/ 08 марта 2020

Благодаря Тому теперь все работает. Если кто-то пытается преобразовать старые классы Webapp2 в Flask, вот код, который заставит его работать с python 3. Ваш синтаксис webapp2 будет работать для использования flask безопасных сеансов, выполнения перенаправлений, отправки запросов и записи на странице. Это будет обрабатывать большую часть того, что делает webapp2. Прямо сейчас вам придется вручную изменить ваши обработчики webapp2 на обработчик Flask внизу, но я собираюсь написать al oop, чтобы повторить это тоже, и я опубликую его здесь позже.

from flask import Flask, session,request,redirect

app = Flask(__name__)

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

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

class BaseHandler:
  def __init__(self):
    self.data = ""
    self.ChangePage="None"
    self.response = Response(self)
    self.session = session
    self.request= {}
  def redirect(self,arg):
    self.ChangePage=arg

class FirstPage(BaseHandler):
    def get(self):
        self.redirect("/SecondPage")
    def post(self):
        self.response.write("First Page Post")

class SecondPage(BaseHandler):
    def get(self):
        self.response.write("second page")
    def post(self):
        self.response.write("Second Page Post")

class MainPage(BaseHandler):
    def get(self):  
        self.session["name"]="Some Name"
        self.session["phone"]="8675309"
        self.response.write("""
        <html>
        <head>
        </head>
        <body>
        """)
        self.response.write("first thing to add")
        self.response.write("""
        <form method="post" action="/">
            <input type="text" name="name">
            <input type="submit">
        """)
        self.response.write("""
        </body>
        </html>
        """)

    def post(self):
        name=self.request.get('name')
        self.response.write("""
        <html>
        <head>
        </head>
        <body>
        """)
        self.response.write("this is the new post page<br/><br/>I posted " + name)
        SessionName=self.session.get("name")
        SessionPhone=self.session.get("phone")
        self.response.write("<br/><br/>my session name is " + SessionName)
        self.response.write("<br/><br/>my session phone number is " + SessionPhone)
        self.response.write("""
        </body>
        </html>
        """)


app.secret_key = 'your-secret-key'

@app.route('/',methods=['GET','POST'])
def daMain():
    if request.method == 'GET':    
        daPage=MainPage()
        daPage.get()
        if daPage.ChangePage=="None":
            return daPage.data
        else:
            return redirect(daPage.ChangePage)
    if request.method == 'POST':
        darequests=request.form
        daPage=MainPage()
        daPage.request=darequests
        daPage.post()
        if daPage.ChangePage=="None":
            return daPage.data
        else:
            return redirect(daPage.ChangePage)

@app.route('/FirstPage',methods=['GET','POST'])
def daFirst():
    if request.method == 'GET':    
        darequests=request.form
        daPage=FirstPage()
        daPage.request=darequests
        daPage.get()
        if daPage.ChangePage=="None":
            return daPage.data
        else:
            return redirect(daPage.ChangePage)
    if request.method == 'POST':
        darequests=request.form
        daPage=FirstPage()
        daPage.request=darequests
        daPage.post()
        if daPage.ChangePage=="None":
            return daPage.data
        else:
            return redirect(daPage.ChangePage)

@app.route('/SecondPage',methods=['GET','POST'])
def daSecond():
    if request.method == 'GET':    
        daPage=SecondPage()
        daPage.get()
        if daPage.ChangePage=="None":
            return daPage.data
        else:
            return redirect(daPage.ChangePage)
    if request.method == 'POST':
        darequests=request.form
        daPage=SecondPage()
        daPage.request=darequests
        daPage.post()
        if daPage.ChangePage=="None":
            return daPage.data
        else:
            return redirect(daPage.ChangePage)

...