首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从另一个模块运行烧瓶服务器?

如何从另一个模块运行烧瓶服务器?
EN

Stack Overflow用户
提问于 2021-02-26 17:46:17
回答 2查看 528关注 0票数 0

我试图从另一个模块运行一个烧瓶服务器,然后关闭服务器(这不是应用程序的要点),目前webserver.py的代码如下所示

代码语言:javascript
复制
from flask import Flask, render_template
from flask_classful import FlaskView
import os
from werkzeug.utils import secure_filename
from flask import request



host = 'localhost'
debug = True


app = Flask (__name__)
app.config

@app.route('/')

def main(): 
   return render_template("index.html")
def run():
    if __name__ == 'Refactor2': 
        app.run(ssl_context = (r"path_to_cert", r"path_to_key"), host = "localhost", port = 443)

def shutdown_server(): 
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()

def shutdownServer():
   shutdown_server() 
   return "Server is shutting down"

然后,我尝试在以下模块(名为Refactor2)中运行这个程序:

代码语言:javascript
复制
import webserver 

class buyer:
    def __init__(self, email, password):
        self.email = email
        self.password = password
    
    def server_run(self):
        run()
        print("Server has been started")

但是,服务器不运行,我无法导航到网页。没有显示错误消息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-26 18:52:22

似乎是一个不寻常的方式来启动一个酒瓶应用程序,但撇开这一点.

假设您正在使用python Refactor2.py运行这个程序,那么__name__将是'webserver'

这可以用一个很小的例子来演示:

代码语言:javascript
复制
$ cat webserver.py 
def run():
    print (__name__)

$ cat Refactor2.py 
import webserver
webserver.run()

$ python Refactor2.py 
webserver

因此,在您的webserver模块中,您可以这样做:

代码语言:javascript
复制
def run():
    if __name__ == 'webserver':
        app.run(ssl_context = (r"path_to_cert", r"path_to_key"), host = "localhost", port = 443)

或者只是:

代码语言:javascript
复制
def run():
    app.run(ssl_context = (r"path_to_cert", r"path_to_key"), host = "localhost", port = 443)

并称之为:

代码语言:javascript
复制
import webserver
# ...
class buyer:
    # ...
    def server_run(self):
        webserver.run()
        print("Server has been started")

当然,在服务器( webserver.run调用)完成和服务器停止之前,不会真正到达‘服务器已经启动’。

同样,这似乎是启动应用程序的一种奇怪方式。我建议您研究如何在生产中运行Flask的文档,因为您试图获得的似乎是编排系统的工作,而不是python进程本身。在生产env中,您应该像gunicorn一样使用WSGI服务器,而不是开发服务器(app.run)。当然,也许你已经知道了;)

票数 0
EN

Stack Overflow用户

发布于 2021-02-26 18:45:48

__name__给出了当前模块的名称。因此,在您的run()方法中,__name__可能解析为webserver。我建议将名称作为变量从run()server_run()传递给

webserver.py

代码语言:javascript
复制
def run(name):
    if name == 'Refactor2':
        app.run(ssl_context = (r"path_to_cert", r"path_to_key"), host = "localhost", port = 443)

Refactor2

代码语言:javascript
复制
import webserver 

class buyer:
    def __init__(self, email, password):
        self.email = email
        self.password = password
    
    def server_run(self):
        run(__name__)
        print("Server has been started")

注意,如果Refactor2在包中,您可能会得到一个虚线模块名,比如‘src.Refactor 2’。最好传递一个更显式的名称来运行,就像重命名Refactor2一样,您也需要在webserver.py中更新硬代码。有点像

代码语言:javascript
复制
def server_run(self):
        webserver.run('buyer')
        print("Server has been started")

(webserver.py)

代码语言:javascript
复制
def run(name):
    if name == 'buyer':
        app.run(ssl_context = (r"path_to_cert", r"path_to_key"), host = "localhost", port = 443)

编辑:不确定您是否提供了完整的代码示例,但看起来您可能没有在server_run()中调用正确的server_run()方法--它看起来应该在webserver模块上调用,我编辑了答案以反映

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66390520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档