「可以的话,想看看更好的自己」
下载python
Django是一个开放源代码的Web应用框架,由Python写成。本来想下载python3.6版本,没想到此Ubuntu自带了python3.8.10,通过指令python3 -V查看python版本,并通过apt install pip3 安装对应的pip。接着我就顺便安装了Python2.7, 直接apt install python2,针不戳。
然后我就发现,无法给python2安装pip,搜一下才发现,Ubuntu 20已经无法通过apt来安装python2的pip2了,只能安装python3的pip。网上有通过wget https://bootstrap.pypa.io/pip/2.7/get-pip.py 再python2 get-pip.py安装,但是我一直被拒绝连接,只能做罢。
幸运的是,安装python模块时,可以通过使用apt工具安装该模块的deb软件包,而且它们已经经过测试,可以在Ubuntu系统上正常工作。Python 3软件包以python3-开头,而Python 2软件包以python2-开头。
安装Django模块
Django版本与Python版本选择对应关系: LTS是长期支持(Long Term Support)的缩写,是官方长期维护的稳定版本,建议使用LTS版本
| Django版本 | 起始维护时间 | Python 版本 |
|---|---|---|
| 1.11(LTS) | 2017.4—2020.4 | 2.7、3.4、3.5、3.6、3.7 (added in 1.11.17) |
| 2.2(LTS) | 2019.4—2022.4 | 3.5、3.6、3.7、3.8(在 2.2.8 中添加)、3.9(在 2.2.17 中添加) |
| 3.2(LTS) | 2021.4—2024.4 | 3.6、3.7、3.8、3.9、3.10(在 3.2.9 中添加) |
| 4.2(LTS) | 2023.4—2026.4 | 3.9、3.10 |
这里我想选择的是3.2版本。通过apt list|grep Django列出Django相关模块,太多了,不知道选啥,还是悬着通过pip安装。
1.venv创建虚拟环境
为了以后的项目不互相影响,我将使用虚拟环境。
因为我的python3.8指令不是python而是python3,以下命令全部换成python3
apt install python3.8-venv # 安装venv
python3 -m venv -h # 显示venv工具的用法
--system-site-packages # 代表使用全局环境中的第三方库(否则虚拟环境直接是纯洁的第三方库)
--without-pip # 代表不安装pip(一般都是要装的,所以默认就行)
python3 -m venv 安装路径 # 创建虚拟环境指令
source 安装路径/bin/activate # 激活虚拟环境
deactivate # 关闭虚拟环境
这里我切换到普通用户的家目录创建了venv_221030虚拟环境。
2.pip安装Django
激活虚拟环境后,使用pip安装。
因为pip下载是很慢的,可以使用国内的下载源,这里我使用的是豆瓣的,并且模块后面接==可以指定版本。
pip install -i https://pypi.doubanio.com/simple/ Django==3.2
安装完毕,通过pip list可以查看已经安装的模块。而退出虚拟环境后,pip list显示的是全局的,没有Django,实现项目之间互不干扰。
创建Django项目
在普通用户的家目录下:
django-admin startproject 项目名 # 创建新项目
python3 manage.py runserver 127.0.0.1:8000 # 8000端口运行程序
ctrl+c # 退出项目运行
然后访问本地8000端口网址,就可以看到:
文件作用:
manage.py:django项目的主管或入口文件,django项目启动时也是通过该入口启动(若非大佬不要动)
setting.py:全项目的配置文件,配置的参数作用范围是全局的(改动时需参考文献)
urls.py:所有地址/url/http请求和视图逻辑层具体函数的关联,定义某个url应该打开的是哪个文件
migrations文件夹:存放数据同步历史的地方(勿动)
admin.py:django自带后台数据库管理页面的控制
models.py:设置数据库表和字段的文件
test.py:django用来进行单元测试的文件
view.py:视图逻辑层 - 用来接收浏览器数据并清洗,整理后传递给业务层(若项目内没有新建业务层,则该文件默认用来接收前端数据并写后端代码)
与Nginx结合
uwsgi是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
这里需要uwsgi,pip安装一下uwsgi。
1.测试uwsgi
创建一个输出hello world的test.py测试uwsgi的安装:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World
执行uwsgi --http :8000 --wsgi-file test.py,可以访问本地8000号端口看到hello world:
2.在django项目内创建uwsgi配置文件
我的路径(普通用户):~/First_Django
[uwsgi]
# nginx连接时使用
socket = 127.0.0.1:8888
# 项目目录
chdir = 路径/First_Django
# 项目中wsgi.py文件的目录
wsgi-file = 路径/First_Django/First_Django/wsgi.py
module = First_Django.wsgi
# 主进程
master = true
# 多进程&多线程
processes = 6
threads = 2
# 以守护进程的方式启动
vacuum = true
# 存储pid进程
pidfile=路径/First_Django/uwsgi.pid
# 存储log日志
daemonize=路径/First_Django/uwsgi.log
执行uwsgi --ini my_uwsgi.ini ,生成进程文件和日志文件,并导入相关配置。
注: 如果未部署nginx或者nginx服务只设置了别的,那么这里 socket = 127.0.0.1 改成 http = 192...(你的地址) 。
3.修改Nginx配置
在nginx文件夹下的conf文件夹下的nginx.conf
server {
...
location / {
root html;
index index.html index.htm;
uwsgi_pass 127.0.0.1:8888; // ip addr and port is your open ip or loopback 127.0.0.1
include uwsgi_params;
}
由于修改了配置文件,必须进行重启nginx -s reload,或者你压根没启动,直接nginx
然后在虚拟机内直接输入127.0.0.1,出现了Django页面
4.加入地址到Django配置
虚拟机内正常了,但是我在外面window访问时(我已经在nginx配置加入的是IP地址)出现报错:
提示我未加入IP到ALLOWED_HOSTS。可以写入配置中,或者直接"*"。
路径:~/First_Django/First_Django/settings.py
ALLOWED_HOSTS = [我的IP]
但是,但是,人麻了,还是这个报错,执行nginx重启、uwsgi重新导入配置、kill杀对应进程都没有用,已经是开始掉头发了。
最后还是重启reboot,然后启动sudo nginx,进入虚拟环境启动uwsgi,然后它好了。
看来是uwsgi没重启,补充一下对应命令:
uwsgi --ini my_uwsgi.ini # 启动uwsgi
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid
并且在my_uwsgi.ini配置文件加入py-autoreload=1,无需重启,修改则生效。外瑞奈斯!
注意: uwsgi命令出现以下报错及解决办法:
No such process [core/uwsgi.c line 1693]
解决:通过 ps -ef | grep uwsgi 查到进程id(第三列),替换到 uwsgi.pid 文件内的id,重新执行命令即可。
5.Nginx开机自启
每次都要启动太麻烦了,加入自启吧。
root用户下:
使用rc.local。ubuntu18.04不再使用 inited 管理系统,改用 systemd,ubuntu20应该也是。所以没有这个文件,需要自己创建。
ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service # 建立软链接
vim /etc/systemd/system/rc-local.service # 编辑文件内容
# 添加以下三行
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
vim /etc/rc.local # 创建并编辑文件
# 以下两行
#!/bin/bash
/usr/local/nginx/sbin/nginx
# 此时rc.local没有可执行权限
chmod +x /etc/rc.local # 添加可执行权限
重启,执行ps -aux|grep nginx,存在进程。开机自启成功!
当然还有其他办法,但是以后可能加别的自启程序,直接加入rc.local可执行文件比较方便顺手。
自此,每次开机只需启动虚拟环境,并运行uwsgi就好(如果愿意,可以试试把这两玩意儿也加入开机自启)
今天又是十一点起床,十二点下床的一天。
球球别失眠了,想早睡早起,吃嘛嘛香。