Django安装与部署

标签: Python 分类: Python 创建时间:2020-08-19 03:10:50 更新时间:2023-10-20 11:23:25

1.Django安装

可以使用conda安装Django,conda的安装可以参考另一篇文章(Post not found: Anaconda之Linux安装和使用 Anaconda之Linux安装和使用)

1
2
3
4
5
## 安装Django
conda install Django

##安装uwsgi
conda install -c conda-forge uwsgi
参考文章:
1.Django 环境搭建 (这里有说明需要安装virtualenv virtualenvwrapper,但是我始终无法成功安装virtualenvwrapper-win)
2.【anaconda】Anaconda3搭建Django步骤 (这个使用了conda创建了虚拟环境而且使用了conda安装了Django并运行)
3.Django+Ubuntu WEB部署(超详细版) (使用uWSGI启动Django)

问题

(1) Building wheel for uwsgi (setup.py) … error
安装uwsgi的时候,一下子就报了红了。

第一次尝试的是安装python3,结果虽然安装成功了python2-devel,但是安装uwsgi还是失败了。

1
2
## CentOS8
yum -y install python3-devel libevent-devel libjpeg-devel

第二次的时候就是尝试参考文章3、4中的方法,使用conda安装uwsgi

1
conda install -c conda-forge uwsgi
参考文章:
1.CentOS7安装uwsgi报错 (我使用了yum install python-devel -y,出现了No match for argument: python-devel)
2.pip安装uwsgi报错 (这篇文件介绍了CentOS8的安装方法,我同样使用了CentOS8,安装了python3-devel,但是安装uwsgi的时候,还是报错了。)
3.Pip 安装uwsgi报错,用conda吧 (这篇文章中使用的是conda install -c conda-forge uwsgi命令安装的uwsgi)
4.conda-forge / packages / uwsgi (这个感觉是conda官方说的如何安装uwsgi)

(2) Connection broken: OSError(“(104, 'ECONNRESET')”)’, OSError(“(104, ‘ECONNRESET’)”)
看问题就是说使用国外的源太慢了,下载不了,使用国内的源代替试试,下面是清华的源。

1
2
3
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

这时候~/.condarc文件就变成了如下内容:

1
2
3
4
5
6
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true

根据我的测试,最好把上面文件中的- defaults去掉,否则,还是会请求国外的源,最后导致失败。

2.Django的debug模式启动

(1)

1
2
3
4
5
6
## 本地8000端口启动
python3 manage.py runserver

## 外网访问
python manage.py runserver 0.0.0.0:8000


(2) windows上开发,我这里使用conda新建了一个虚拟环境(注意,要在cmd窗口中,不能再PowerShell窗口中操作)

1
2
3
4
5
6
7

## 切换虚拟环境
activate django
## 安装相应的依赖
conda install django
## 进入开发目录
cd /d D:\zlc\hdxs\HdxsPipeDecision

3.uwsgi部署

(1) 编写uwsgi.ini文件

1
2
3
4
5
6
7
8
9
[uwsgi]
http-socket = 0.0.0.0:8000
chdir=/cloud/dev/PhDataprediction/HdxsPipeDecision
module=hdxsPipeDecision.wsgi
master=True
pidfile=/tmp/HdxsPipeDecision.pid
vacuum=True
max-requests=5000
daemonize=/cloud/dev/PhDataprediction/HdxsPipeDecision/HdxsPipeDecision.log

(2) 使用uwsgi命令行启动

1
2
3
4
5
6
7
8
9
10
11
## 后台启动
uwsgi -d --ini uwsgi.ini

## 当时忘记为什么上面的命令启动不了了,于是尝试了下面的方式进行系统的启动
uwsgi --http :8000 --chdir /cloud/dev/PhDataprediction/HdxsPipeDecision --module hdxsPipeDecision.wsgi

## 停止,注意这里的pid文件,是你在ini中配置的pid文件的路径
uwsgi --stop /tmp/HdxsPipeDecision.pid

## 重启,注意这里的pid文件,是你在ini中配置的pid文件的路径
uwsgi --reload /tmp/HdxsPipeDecision.pid

其中–chdir指定了我的项目的根目录,–module指定了我的wsgi文件所在位置 比如:

参考文章:
1.Python/WSGI 应用快速入门 (这里介绍了如何使用uwsgi启动一个Django程序)
2.uwsgi 的启动、停止、重启
3.uwsgi后台运行/背后运行/守护运行的方法
4.如何用 uWSGI 托管 Django
5.Django UWSGI设置(上线部署) (这里对ini配置文件都做了说明,缺少的就是配置http端口)
6.如何用 uWSGI 托管 Django (这个其实有点简单了,连配置端口都没有)

问题

(1) Internal Server Error
使用uwsgi部署了Django,调用服务的时候,总是出现了:。

同时我发现了: no python application found, check your startup logs for errors 这个提示,循着这个思路,我又尝试了好的的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
## 错误一
uwsgi --plugin python --http :8000 --chdir /cloud/dev/PhDataprediction/HdxsPipeDecision --wsgi-file /HdxsPipeDecision/hdxsPipeDecision/wsgi.py --callable app

## 错误二
uwsgi --plugin python --http :8000 --chdir /cloud/dev/PhDataprediction/HdxsPipeDecision --wsgi-file hdxsPipeDecision/wsgi.py --callable app

## 错误三
uwsgi --http :8000 --chdir /cloud/dev/PhDataprediction/HdxsPipeDecision/ --wsgi-file HdxsPipeDecision/hdxsPipeDecision/wsgi.py --callable app


## 正确的指定方式,主要就是把--wsgi-file换成了--module
uwsgi --http :8000 --chdir /cloud/dev/PhDataprediction/HdxsPipeDecision --module hdxsPipeDecision.wsgi


(2) Invalid http_host header
成功启动了uwsgi之后,访问相关的内容,出现了host错误:Invalid HTTP_HOST header: ‘192.168.1.90:8000’. You may need to add ‘192.168.1.90’ to ALLOWED_HOSTS.

可以修改settings.py文件中的ALLOWED_HOSTS

1
ALLOWED_HOSTS = ['*']
参考文章:
1.Invalid http_host header

(3) 使用ini文件部署,没有监听8000端口
当我使用ini文件的方式进行启动的的时候,使用:ps -aux |grep uwsgi 命令,查询启动进程,发现uwsgi已经启动了

但是我使用了 netstat -ntulp |grep 8000 命令查询端口的时候,却发现没有相应的程序监听端口

uwsgi.ini中的配置:

1
2
3
4
5
6
7
8
9
10
11

[uwsgi]
http=8000
chdir=/cloud/dev/PhDataprediction/HdxsPipeDecision
module=hdxsPipeDecision.wsgi
master=True
pidfile=/tmp/HdxsPipeDecision.pid
vacuum=True
max-requests=5000
daemonize=/cloud/dev/PhDataprediction/HdxsPipeDecision/HdxsPipeDecision.log

解决方法就是把上面的http配置改为http-socket配置

1
2
3
4
## 只能本机8000端口访问
http-socket = 127.0.0.1:8000
## 外部也可以通过8000端口访问
http-socket = 0.0.0.0:8000
参考文章:
1.#从根本解决# uwsgi –ini uwsgi.ini 无法绑定端口 (查询端口占用,其他的对我基本没用)
2.uwsgi后台运行(守护运行)和停止运行的方法 (加了一个-d参数,就实现了后台服务的方式启动)
3.uwsgi.ini (这是uwsgi.ini的详细配置,包括了如何与nginx进行通讯的配置,还有启动,重启和停止uwsgi都有说明)
4.uwsgi 配置总结 (这篇文章的配置总结,和上一篇的有些不同,这里的nginx不像上面文章中说的,使用的是端口的通讯,这篇文章使用的是文件和nginx中upstream的方式定义了uwsgi和nginx通讯)

4.使用nginx部署

使用nginx转发请求,其实说简单也简单。
(1) 配置uwsgi.ini

1
socket = 127.0.0.1:8001

(2) 配置nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http {
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server {
listen 80;
server_name localhost;
## 华电下沙数据决策
location / {
include uwsgi_params;
uwsgi_pass django;
}
}
}

(3) 但是如果我不限作为根目录部署,如何使用二级目录呢,比如:location /test,如果还是原样配置的话,就会把全部的路径都转发到django上去,但是我的django上没有这个路径

最后就会造成没有这个路径的错误

所以解决方法,就是只能使用proxy_pass进行转发,修改server配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
## upstream 改成8000的http端口,而不是socket的8001端口
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}

## 华电下沙数据决策
location /HdxsPipeDecision/ {
# include uwsgi_params;
# uwsgi_pass 127.0.0.1:8001;
proxy_pass http://django/;
}

参考文章中有这么一段话:

uwsgi_pass,注意这个配置项无需也不能写出http://和后面的URI,这也就意味着,原生请求的URI只能一一对应到uwsgi_pass设置的值的这个根URL上去。

我尝试了下面的多个配置,使用uwsgi_param也是不行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
location /HdxsPipeDecision/ {
include uwsgi_params;
#uwsgi_pass 127.0.0.1:8001;
#proxy_pass http://django/;
uwsgi_pass django;

uwsgi_param SCRIPT_NAME /;
uwsgi_modifier1 30;
#proxy_pass http://django/api;
#proxy_redirect off;
}


uwsgi_params 文件是啥?它就是为了方便,仅此而已!
这是官网的一句话,但是还是没有打消我对这个参数的含义的困惑。

参考文章:
1.配置Nginx+uwsgi更方便地部署python应用
2.Nginx支持 (这个好像更加的简单,只有uwsgi_pass和uwsgi_params,没有用到upstream)
3.DJANGO + UWSGI部署
4.Nginx upstream配置说明负载均衡 (使用upstream进行负载均衡的操作)
5.Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问 (这里有使用proxy_pass进行二级代理的方法)
6.一文弄懂Nginx的location匹配 (关于尾部到底要不要加斜杠的问题,加了斜杠,转发时就不会带着匹配到的路由)
7.【Flask】 利用uWSGI和Nginx发布Flask应用 (虽然是Flask,但是也是写了uwsgi_pass的规则)
8.使用 uWSGI 和 Nginx 部署 Django 项目 (使用socket开销低,但是还是部署到了根路径上了。)
9.如何将django部署从顶级目录迁移到子目录下(NGINX UWSGI DJANGO) (这里有一个uwsgi_param SCRIPT_NAME /prism ,这个uwsgi_param的作用还是没有搞清楚)
10.使用uWSGI和nginx来设置Django和你的web服务器 (这是uWSGI的doc,也是部署在根目录下的)
11.Nginx支持 (这篇文章讲了uwsgi_params 文件是啥?就是为了方便而已)
12.uwsgi协议魔术变量 (这里讲了uwsgi_params中各个变量的含义到底是什么)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。