阿里云 网站服务器 文章摘要:本文解释了WSGI、uWSGI和uwsgi三个概念的关系与区别,详细介绍了Python Django项目的容器化部署过程,包括数据库配置、Dockerfile编写、项目代···
阿里云 网站服务器
文章摘要:本文解释了WSGI、uWSGI和uwsgi三个概念的关系与区别,详细介绍了Python Django项目的容器化部署过程,包括数据库配置、Dockerfile编写、项目代码生成和ALLOWED_HOSTS安全设置等关键步骤。最后通过docker容器启动Django项目并完成访问验证,实现了一个完整的Web应用容器化部署方案。
一、理解WSGI、uWSGI
WSGI:全称 Web Server Gateway Interface1.1 使用餐厅来理解
用开餐厅来理解这三个"WSGI"
想象一下你要开一家餐厅,这三个概念就像餐厅运营中的不同角色:
WSGI=餐厅的服务标准规范(比如"顾客点单→厨师做菜→服务员上菜"这套流程)uWSGI=全能的后厨管理系统(包括厨师、厨具、出菜窗口等整套厨房设备)uwsgi=厨房内部的高效沟通语言(厨师们之间说的"行话")1 WSGI:餐厅的服务标准协议
WSGI(Web Server Gateway Interface)就像餐饮协会制定的标准服务流程:
规定了服务员(Web服务器)如何接收顾客(浏览器)的点单(请求)规定了服务员如何把点单交给厨师(Python应用)规定了厨师做完菜后如何通过服务员上菜给顾客(响应)关键点:WSGI只是一个标准/规范,不是具体的工具。它告诉Python应用和Web服务器:"你们应该这样沟通合作"。
这就是一个最简单的WSGI应用,就像个只会做一道菜的厨师defsimple_chef(environ, start_response):start_response(200 OK, [(Content-Type,text/plain)])return[bHello, this is your dish!]2. uWSGI:全能的后厨管理系统
uWSGI是一个具体的应用服务器,就像一套完整的后厨系统:
华为云服务器免费一年
它理解WSGI标准(知道餐厅服务流程)它能管理多个厨师(运行多个Python应用进程)它能应对高峰期(负载均衡)它负责备料和清理(资源管理)实际场景:
这就好比启动整个后厨系统,配备4个厨师,监听8000号窗口uwsgi--http:8000--wsgi-filemy_app.py--processes43. uwsgi:厨房内部的高效沟通语言
uwsgi(注意全小写)是uWSGI服务器自己定义的内部通信协议,就像:
厨师之间说的专业术语("大火爆炒"、"文火慢炖")厨房内部的高效沟通方式不同于对外服务时用的普通话(HTTP协议)1.2 三者的关系图解
顾客(浏览器) │ ↓ 用普通话点单(HTTP协议) 服务员(Nginx等Web服务器) │ ↓ 用厨房行话传达(uwsgi协议) 后厨管理系统(uWSGI服务器) │ ↓ 按照标准流程操作(WSGI规范) 厨师(Python应用程序) │ ↓ 做好菜 后厨管理系统(uWSGI服务器) │ ↓ 用厨房行话回复(uwsgi协议) 服务员(Nginx等Web服务器) │ ↓ 用普通话上菜(HTTP协议) 顾客(浏览器)1.3 实际工作流程举例
假设你用Flask写了个网站:
开发时:直接用Flask自带的简易服务器
fromflaskimportFlask app = Flask(__name__)@app.route(/)defhello():return"Hello World!"if__name__ ==__main__: app.run()这只是个临时厨师,能力有限上线时:需要专业的uWSGI后厨系统
用专业后厨系统来运行你的Fl应用uwsgi--socket:8000--wsgi-fileapp.py--callableapp--processes4搭配Nginx:再加上专业服务员
Nginx配置:专业服务员对接专业后厨location/ {includeuwsgi_params;学会厨房行话uwsgi_pass127.0.0.1:8000;把订单传给后厨}1.4 为什么要这么复杂?
拨号云服务器
就像开餐厅一样:
小摊贩:老板又当服务员又当厨师(开发用Flask内置服务器)正规餐厅:专业服务员(Nginx) + 专业后厨(uWSGI) + 标准流程(WSGI)人少的时候小摊贩还能应付,客人一多就需要专业分工了!
再次理解:
WSGI是"规矩":规定Python应用怎么和服务器说话uWSGI是"能手": 一个既懂规矩又能干活的专业服务器uwsgi是"行话": uWSGI自己用的高效沟通语言,其实就是传输的具体数据二、python django项目容器化
注:完整代码和文件详见git地址,关注和转发后可私信获取
2.1、准备数据库
Django 需要连接数据库是因为它是一个数据驱动的 Web 框架,大多数 Web 应用都需要持久化存储数据。没有数据库,Django 就无法提供用户认证、会话管理、数据持久化等核心 Web 应用功能。数据库是 Django 应用的"记忆中心",存储了应用运行所需的所有结构化数据。
为什么 Django 需要数据库?
Web 应用需要保存用户数据、应用状态等信息服务器重启后数据不会丢失支持数据查询、更新、删除等操作ORM(对象关系映射)
Django 提供了强大的 ORM,让你用 Python 代码操作数据库,而不用直接写 SQL:
使用 Django ORMuser= User.objects.get(username=john) user.email =new@email.comuser.save()而不是写原始 SQLUPDATE auth_user SET email = new@email.com WHERE username = john;Django 数据库中存放的数据类型
用户和认证数据会话数据内容类型框架迁移记录管理后台日志站点框架你的应用数据使用docker启动postgres数据库docker run -d--name django-postgres -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres:18.02.1、创建项目需要的示例代码
Dockerfile内容如下FROMpython:3.14ENVPYTHONUNBUFFERED 1RUNmkdir /codeWORKDIR/codeCOPYrequirement.txt /codeRUNpip install -r requirement.txtrequirement.txt 文件内容如下Django>=4.2,<5.0psycopg2构建镜像文件执行命令生成相关项目代码docker run --rm -v $(pwd):/codepython-django /bin/sh -c"django-admin startproject myexample /code"2.3、修改数据库配置文件
修改myexample/settings.py文件
DATABASES = {default: {ENGINE:django.db.backends.postgresql,NAME:postgres,USER:postgres,PASSWORD:mysecretpassword,HOST:192.168.88.163,PORT:5432, } }2.4、配置ALLOWED_HOSTS 参数
ALLOWED_HOSTS 是 Django 中一个重要的安全设置,用于防止 HTTP Host 头攻击。ALLOWED_HOSTS 是一个列表,包含了 Django 应用可以服务的有效主机/域名。当收到 HTTP 请求时,Django 会检查请求的 Host 头是否在这个列表中,如果不在,Django 将拒绝该请求。
为什么需要 ALLOWED_HOSTS?
安全防护:防止 HTTP Host 头攻击请求验证:确保 Django 只响应来自可信域名的请求CSRF 保护:CSRF 中间件依赖正确的 Host 头验证settings.py允许所有主机(仅用于开发,不安全)ALLOWED_HOSTS= [*]或者指定具体的主机ALLOWED_HOSTS = [localhost,127.0.0.1,0.0.0.0,Docker 容器常用192.168.1.100,本地网络 IP]2.5、启动django web容器
dockerrun-d-p8000:8000djando-web使用浏览器访问验证超级云服务器

发表评论
最近发表
标签列表