首页 > 系统相关 >发布用flask框架开发的python后端程序到windows服务器

发布用flask框架开发的python后端程序到windows服务器

时间:2024-07-12 16:29:46浏览次数:12  
标签:Tornado flask app python windows Flask CORS import

flask框架开发的python后端程序开发好了后,怎么发布到生产环境呢?
以app.run()的方式在生产环境上启动服务,当有异常特别容易退出,而且性能很弱。
生产环境下,python常见的web部署搭配是 nginx+gunicorn。但是这种搭配只适合在Linux环境下。gunicorn不支持windows环境。如果要搭建在windows环境下,可以使用Flask + Tornado+nginx的部署方案。
#一、安装Tornado

pip install tornado

#二、后端程序flask_app.py
假设已经开发好一个后端程序,以一个处理前端发来的登录请求为例,示例代码如下:

# 导入Flask模块
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"

# 假设的用户数据库,实际应用中应该是数据库查询
users_db = {
    "user1": "password1",
    "user2": "password2"
}

@app.route("/login", methods=['POST'])
def login():
    # 获取请求体中的数据,这里假设前端发送的是JSON格式
    data = request.get_json()
    
    # 获取用户名和密码
    username = data.get('username')
    password = data.get('password')
    
    # 检查用户名是否存在
    if username not in users_db:
        return jsonify({'message': 'User not found'}), 200
    
    # 检查密码是否正确
    if users_db[username] == password:
        # 如果用户名和密码都正确,返回成功消息
        return jsonify({'message': 'Login successful'}), 200
    else:
        # 如果密码错误,返回错误消息
        return jsonify({'message': 'Incorrect password'}), 200

#三、编写Tornado的 server.py文件
server.py文件与flask_app.py要存放在同一个目录下。

from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from flask_app import app
from tornado.ioloop import IOLoop

s = HTTPServer(WSGIContainer(app))
s.listen(8080) # 监听 8080 端口
IOLoop.current().start()

这段代码使用了Python的Tornado库和Flask框架来创建一个Web服务器。下面是逐行解释:

1.from tornado.httpserver import HTTPServer:
这行代码从tornado.httpserver模块导入HTTPServer类。HTTPServer是Tornado库中用于创建HTTP服务器的类。
2.from tornado.wsgi import WSGIContainer:
这行代码从tornado.wsgi模块导入WSGIContainer类。WSGIContainer是一个适配器,它允许Tornado的HTTP服务器与WSGI(Web Server Gateway Interface)应用一起工作。Flask是一个WSGI应用。
3.from flask_app import app:
这行代码从flask_app模块导入app对象。这里假设flask_app.py是一个Python文件,其中创建了一个Flask应用实例并将其赋值给变量app。
4.from tornado.ioloop import IOLoop:
这行代码从tornado.ioloop模块导入IOLoop类。IOLoop是Tornado的事件循环,用于处理异步IO操作。
5.s = HTTPServer(WSGIContainer(app)):
这行代码创建了一个HTTPServer实例,并将WSGIContainer(app)作为参数传递给它。这将Flask应用app包装在一个WSGI容器中,使其能够在Tornado服务器上运行。
6.s.listen(8080):
这行代码让服务器监听本地的8080端口。这意味着服务器将接受发送到端口8080的HTTP请求。
7.IOLoop.current().start():
这行代码启动当前的IOLoop事件循环。在Tornado中,事件循环负责处理所有的异步操作,包括网络请求、定时器等。调用start方法后,服务器将开始接受和响应HTTP请求。
总的来说,这段代码的作用是将一个Flask应用部署到一个使用Tornado作为底层服务器的Web服务器上,监听8080端口,并启动事件循环以处理请求。这是一种常见的做法,用于利用Tornado的非阻塞特性来提高Flask应用的性能。

#四、启动服务
切换到 python server.py 所在的目录,然后执入如下命令:

python server.py

在浏览器中访问 http://ip:8080 ,收到返回:Hello World!即为发布成功。
注意:
由于视图函数login()为POST模式,所以不能在浏览器地址栏输入地址http://ip:8080/login的 方式测试。需通过浏览器调试模式或用postman工具发送post请求进行测试。
如何使用postman发送post请求可以参考:https://blog.csdn.net/cultivate1/article/details/140357700
#五、跨域问题
由于前端和后端可能在不同的端口或域名上运行,浏览器可能会阻止跨域请求。可以使用CORS来解决这个问题,但需要确保它在所有路由上都有效。如果 CORS没有正确配置,前端请求可能会因为跨域问题而被阻止。
CORS(跨源资源共享)是一种安全策略,它允许你指定哪些外部域可以访问你的服务器资源。在使用 Flask 时,可以通过 flask_cors 扩展来实现 CORS 支持。以下是如何配置 flask_cors 的一些基本步骤:
##安装 flask_cors:
首先,你需要安装 flask_cors 扩展。可以通过 pip 来安装:

pip install flask-cors

##导入 CORS:
在 Flask 应用中导入 CORS:

from flask_cors import CORS

##应用 CORS:
在你的 Flask 应用实例上应用 CORS。这可以通过两种方式完成:直接在应用实例上调用 CORS(),或者作为装饰器应用到特定的路由上。

###全局应用 CORS:
如果你想允许所有跨域请求,可以在应用实例上直接使用 CORS():

app = Flask(__name__)
CORS(app)

###局部应用 CORS:
如果只想对特定的路由启用 CORS,可以作为装饰器使用:

@app.route("/login", methods=['POST'])
def login():
    # 你的登录逻辑

##配置 CORS 参数:
CORS() 函数接受多个参数来自定义 CORS 行为。以下是一些常用的参数:
origins: 指定允许的源。可以是单个源的字符串,或者源列表。使用 “*” 表示允许所有源。
methods: 指定允许的 HTTP 方法。默认为所有方法。
allow_headers: 指定允许的 HTTP 头。
expose_headers: 指定客户端可以访问的服务器响应头。
supports_credentials: 布尔值,指示是否允许发送凭证(如 Cookies 或 HTTP 认证)。
max_age: 预检请求的缓存时间(秒)。
例如,如果你想只允许特定的源进行跨域请求,可以这样配置:

CORS(app, origins=["http://example.com"])

##测试 CORS 配置:
配置完成后,确保测试 CORS 设置以验证它是否按预期工作。

这里将上面的后端程序配置 CORS ,允许所有源访问所有路由,示例代码:

# 导入Flask模块
from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
@app.route("/")
def hello():
    return "Hello World!"

# 假设的用户数据库,实际应用中应该是数据库查询
users_db = {
    "user1": "password1",
    "user2": "password2"
}

@app.route("/login", methods=['POST'])
def login():
    # 获取请求体中的数据,这里假设前端发送的是JSON格式
    data = request.get_json()
    
    # 获取用户名和密码
    username = data.get('username')
    password = data.get('password')
    
    # 检查用户名是否存在
    if username not in users_db:
        return jsonify({'message': 'User not found'}), 200
    
    # 检查密码是否正确
    if users_db[username] == password:
        # 如果用户名和密码都正确,返回成功消息
        return jsonify({'message': 'Login successful'}), 200
    else:
        # 如果密码错误,返回错误消息
        return jsonify({'message': 'Incorrect password'}), 200

#六、配置nginx反向代理

http {   
    server {
        listen       80;
        server_name  www.test.com;
        charset     utf-8;         

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass  http://ip:8080;
        }
     
  }

配置好nignx反向代理,这样在浏览器中直接访问www.test.com 即可

如果不知道如何在windows下安装和使用nginx,网上教程很多,可以下载学习。

标签:Tornado,flask,app,python,windows,Flask,CORS,import
From: https://blog.csdn.net/cultivate1/article/details/140352411

相关文章

  • 雨晨 Windows 10 IOT 企业版 2021 长期服务版 19044.4651
    文件:YC19044.4561_iotltsc2021_x64_VIP3in1_install.wim同时支持直接激活以专业版为基础的所有虚拟版本大小:2653323398字节修改时间:2024年7月12日,15:39:54MD5:52565BC0E1DC7F205353E25CBE0AA2F7SHA1:E327D67581FD86DDF6F816870DA4C8EFEE589825CRC32:DAFC1D2......
  • 环境部署之在 Linux 服务器上搭建和部署 Python 环境
    背景说明在企业工作中,自动化测试框架落地肯定会集成到Jenkins服务器上做持续集成测试,自动构建以及发送结果到邮箱,实现真正的无人值守测试。不过Jenkins搭建一般都会部署在公司的服务器上,不会在私人电脑里,而服务器大部分都是Linux操作系统的。如果要在Linux上的Jenkins服......
  • 后劲真大,我愿称之为学习python的“圣经”
    很多小伙伴都在学习Python,但是爱看书的找不到适合自己的,这本书可以完美的解决你的问题,还能帮助到很多需要处理数据,做Excel自动方面的。学习数据分析的好处众多,无论是对于个人职业发展还是企业的运营决策都具有重要意义。以下是学习数据分析的主要好处:提高就业竞争力:在信息化......
  • python模块之configparser
    大家看我前面的笔记中,介绍过了专门用于处理日志的logging模块,下面我们来说一下专门处理配置文件的configparser模块。这个模块其实也没什么难度,说到底还是做文件处理用的,做运维的朋友们可以多研究下。来吧,直接上代码:importconfigparserconfig=configparser.ConfigParser()c......
  • python中一些特殊方法及含义
    python中一些特殊方法及含义,后期会根据系统学习后修正补充归纳汇总初始化和销毁:__init__(self[,args...])对象初始化,构造函数,在生成对象时调用,简单的调用方法:obj=className(args)初始化方法,在创建对象时进行初始化操作__del__(self)......
  • Cellebrite UFED 4PC 7.69 (Windows) - Android 和 iOS 移动设备取证软件
    CellebriteUFED4PC7.69(Windows)-Android和iOS移动设备取证软件TheIndustryStandardforLawfullyAccessingandCollectingDigitalData请访问原文链接:https://sysin.org/blog/cellebrite-ufed/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCellebri......
  • [1032] SQLAlchemy—the magical bridge between Python and databases!
    Ah,SQLAlchemy—themagicalbridgebetweenPythonanddatabases!......
  • python--实验10 封装,继承,多态
    目录知识点 封装(PART1)继承(PART2)多态(PART3)动态性(PART4)小结知识拓展实验 知识点 封装(PART1)定义:封装是将数据(属性)和行为(方法)组合在一起的过程,通常封装在类中。目的:保护数据不被外部直接访问和修改,提高程序的安全性和可维护性。类和对象:......
  • 毕业设计之python语音数据及标注核对审核系统设计与实现(python完整源码+说明文档+演示
    1项目介绍基于python的语音标注及审核系统的目的就是在于建立属于自己的一套识别系统,在日常的工作中,语音识别是一件非常重要的事情,比如说企业或事业单位当中。自动整理语音数据,保存到数据库当中,实现数据对应一致性,这样可以很大程度地进行数据的校验。2、项目技术项目后......
  • Windows下,在Qt中使用OSG
    安装直接用vcpkg安装vcpkginstallosg:x64-windows这样可能会报错:error:whileloadingD:\vcpkg\ports\netcdf-c\vcpkg.json:$.default-features[1]:mismatchedtype:expectedanidentifier这个问题有人遇到,并且在github上提出了:【[netcdf-c]buildfailure#38449......