栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

2021-10-27

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-27

1、创建django项目

a)

安装django依赖包:pip3 install Django
# 使用 django-admin 来创建 HelloWorld 项目
django-admin startproject src
cd src/
执行同步数据库文件:python3 manage.py migrate
# 启动django
python3 manage.py runserver 0.0.0.0:8000

本地测试:
在浏览器中输入127.0.0.1:8000
后面将代码放到了服务器上进行测试

b) django中连接mysql数据库

DATAbaseS = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': base_DIR / 'db.sqlite3',
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'jlpost',
        'USER': 'root',
        'HOST': '10.30.239.206',
        'PASSWORD': '123456',
        'PORT': '3306',
    }
}

c) 安装mysql
安装mysql:参见https://www.runoob.com/mysql/mysql-install.html
安装pymsql==1.0.2作为数据库驱动,在_init_.py文件中配置,此处需要指定pymysql的版本,否则可能报错

import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

在测试代码的时候此处遇到一个问题Forbidden (CSRF cookie not set.),参见:https://blog.csdn.net/qq_43245972/article/details/87883108

d) 运行时数据库会报错

django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

解决方法如下:https://blog.csdn.net/weixin_43336281/article/details/100055435
https://my.oschina.net/u/4337873/blog/4279371

得到django项目目录如下:

2、docker部署

采用uwsgi+nginx部署项目。服务器:CentOS 7.9

2.1 uwsgi启动django

  • 安装uwsgi
pip3 install uwsgi

报错如下:

查阅资料发现是python3_devel(centos系统下)未安装,补充该安装包,成功

yum install python3-devel
  • 收集静态资源
    配置django目录下的settings.py
# 静态资源访问的起始url
STATIC_URL = '/static/'
# 指定静态资源所在的目录
STATICFILES_DIRS = [
    os.path.join(base_DIR, 'hello_dist', 'dist', 'static'),
]
# 设置收集静态资源的路径(部署时使用)
STATIC_ROOT = os.path.join(base_DIR, 'hello_dist', 'dist')

收集静态资源

python3 manage.py collectstatic
  • 新建uwsgi.ini,与manage.py同一目录下,配置uwsgi.ini
[uwsgi]
; 监听的端口
http = :8001

;指定和nginx进行套接字通信的方式:端口或文件
; socket = :8002

; 项目所在目录,和manage.py同级
chdir = /opt/zxq/hello

; 主应用中的wsgi文件
wsgi-file = /opt/zxq/hello/src/wsgi.py

; 代理静态资源:路径映射
static-map = /static=/opt/zxq/hello/src/hello_dist/dist

; 启动一个master进程,来管理其余的子进程
master=True
processes = 4
threads = 2

; 保存主进程的pid,用来控制uwsgi服务
pidfile=/opt/zxq/hello/logs/uwsgi.pid

; 设置后台运行,保存日志
daemonize=/opt/zxq/hello/logs/uwsgi.log

; 设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏
max-requests=5000

; 服务停止时自动移除unix Socket和pid文件
vacuum=true
  • 启动与关闭
uwsgi uwsgi.ini

# 停止
uwsgi --stop logs/uwsgi.pid
pkill -f uwsgi -9

问题:
采用runserver的命令直接启动django时,无报错信息,网页能够正常使用,但是采用uwsgi启动时,日志报错:sqlite版本过低

检查sqlite版本信息:

find / -name sqlite3*

检查发现:/usr/bin/sqlite3软链接存在异常,重新设置软链接,失败,仍然无法访问网页

ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3

查阅资料:https://blog.csdn.net/legendary_Dragon/article/details/117295774,可能是sqlite3的库文件没有更新,uwsgi优先调用/usr/lib64/目录下的库文件
替换后成功运行

# 查找库文件
find / -name *sqlite3.so.0
# 替换.so文件
cp /usr/local/sqlite/lib/libsqlite3.so.0 /usr/lib64/libsqlite3.so.0

  • 日志配置
    由于uwsgi的入口是src/wsgi.py,因此需要在该文件下配置日志输出信息,将django请求的日志记录下来。
def _handle_cmd_line(args=None):
    parser = OptionParser()

    parser.add_option("--id", dest="id", action="store",
                      type="string", default="0",
                      help="id use guard and create log file")
    parser.add_option("--logconfig", dest="logconfig", action="store",
                      type="string",
                      default=os.path.join(
                          work_dir, 'etc', 'log.conf'),
                      help="log config file [%default]")

    (options, args) = parser.parse_args(args=args)
    return options, args


options, _args = _handle_cmd_line()
if options.logconfig:
    defaults = {"id": options.id}
    logging.config.fileConfig(options.logconfig, defaults)

2.2 采用nginx代理

  • 安装nginx,并启动ngix
# 防止报错nginx包不存在
yum install epel-release
yum install nginx
systemctl start nginx
  • 修改6.1节中的uwsgi.ini,添加socket端口
[uwsgi]
; 监听的端口,不配置nginx
; http = :8001

; 指定和nginx进行套接字通信的方式:端口或文件
socket = :8002
#---
# 其它配置不变
#---

  • 配置 uwsgi 和 Nginx 的连接,并重启nginx:systemctl start nginx
vim  /etc/nginx/nginx.conf
# 修改user为root
user root;
# 在server中添加如下配置
server {
		listen 8088;
    	location /static {    # 静态资源加载的路径
        	alias /opt/zxq/hello/src/hello_dist/dist;
    	}
		location / {
			include uwsgi_params;
			# 转发的ip和端口
        	uwsgi_pass  0.0.0.0:8002;
	}
}

nginx 启动失败https://blog.csdn.net/xiaohuai0444167/article/details/105758684/
linux

查看端口占用  lsof -i:8002
查看端口使用netstat -anpt
启动nginx  systemctl status nginx
查看nginx运行状态  systemctl start nginx
删除所有nginx的进程  killall -9 nginx
  • 启动项目
cd /opt/zxq/hello
uwsgi --ini uwsgi.ini

在浏览器中输入http://10.30.239.199:8088/Weibo

3、项目部署(docker)

3.1 linux安装docker

  • 启动docke
systemctl start docker

3.2 docker打包有ssh服务的centos镜像
一般情况下,linux操作系统的管理员通过SSH服务来管理操作系统,但是Docker的很多镜像都是不带SSH服务的,因此需要创建一个带有SSH服务的centos镜像

某些情况下,docker拉取镜像会报超时错误,处理方法:https://www.cnblogs.com/ws0316/p/12066454.html

  • docker拉取镜像
docker pull centos
  • 检查centos中是否存在ssh服务
# 启动centos镜像,docker.io/centos通过docker images得到
docker run -it -d --name django_base -t centos:latest /bin/bash
# 查看已启动的容器
docker ps
# 查找某个容器id,进入已启动的容器中
docker exec -it 86 /bin/bash
  • 判断该容器安装此服务
sshd

  • 创建镜像打包目录,创建Dockerfile,run.sh两个文件,并赋予run.sh执行权限
cd /opt/zxq/ssh_centos
touch Dockerfile run.sh
chmod +x run.sh
  • run.sh写入配置
#! /bin/bash
/usr/sbin/sshd -D
  • dockerfile写入配置文件
# 设置继承镜像
FROM centos:latest

# 开始运行命令
RUN yum install -y openssh-server
RUN yum install -y passwd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
RUN echo "123456" | passwd --stdin root  # 系统密码,可自行更改
ADD run.sh /run.sh

EXPOSE 22

CMD ["/run.sh"]

  • 创建镜像
docker build -t sshd:centos .

3.3 docker打包有python3服务的centos镜像
由于机器学习必备python3的一些环境,因此,制作一个python3的基础镜像

  • 创建镜像打包目录,创建Dockerfile
cd python3_centos
touch Dockerfile
  • dockerfile写入配置文件
# 指定操作的镜像
FROM sshd:centos

# 创建文件夹
RUN mkdir -p /opt/install

# 安装软件
# 安装centos的yum源
RUN yum install epel-release -y
RUN yum -y install wget
# 安装python 3.6
RUN yum install -y libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
# 存放安装包的路径
WORKDIR /opt/install
RUN wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
# 解压
RUN tar -zxvf Python-3.6.8.tgz
WORKDIR Python-3.6.8
RUN ./configure
RUN make&&make install

  • 打包镜像
 docker build -t python3:centos .

3.4 基于python3:centos打包django镜像

  • 创建镜像打包目录,创建Dockerfile、web_run.sh,赋予web_run.sh执行权限
cd django_centos
touch Dockerfile
  • dockerfile写入配置文件
# 指定操作的镜像
FROM python3:centos
# 指定语言,防止中文日志乱码
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8
# 创建文件夹
# 项目存放路径
RUN mkdir -p /opt/zxq/hello	

# 拷贝文件
# django项目地址
COPY hello /opt/zxq/hello	

#这句指令相当与:cd django项目
WORKDIR /opt/zxq/hello	

# 安装依赖包
RUN pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

EXPOSE 8002

  • 使用当前目录的 Dockerfile 创建镜像,标签为 web:django
docker build -t web:django .

3.5 docker打包nginx镜像

  • 创建镜像打包目录,创建Dockerfile
 docker pull nginx
 cd django_nginx
 touch Dockerfile

  • dockerfile写入配置文件
# 指定操作的镜像
FROM docker.io/nginx

# 系统部署
RUN mkdir -p /opt/zxq/static
  • 使用当前目录的 Dockerfile 创建镜像,标签为 web:nginx
docker build -t web:nginx .

  • 启动并访问nginx
# 80是nginx访问端口
docker run -d -p 80:80 --name nginx nginx

访问页面:ip,能够看到欢迎页面,表示nginx启动成功。

  • 配置nginx
    首先在宿主机建立存放nginx日志、配置文件和相关静态资源的目录,并将其挂载到容器内对应路径

将nginx.conf文件cp到本地,可以看到该文件下引入了其它文件,同样也需要cp到宿主机,进入nginx查看文件名,并cp到本地

 docker cp nginx:/etc/nginx/nginx.conf /opt/zxq/nginx/conf/nginx.conf
 docker cp nginx:/etc/nginx/conf.d/default.conf /opt/zxq/nginx/conf.d/default.conf

  • nginx初始访问页面同样cp到本地
docker cp nginx:/usr/share/nginx/html/index.html /opt/zxq/nginx/static/index.html

3.6 基于docker镜像启动django容器

docker run -it -d -p 8002:8002 --name web --rm web:django python3 manage.py runserver 0.0.0.0:8002

8002端口的服务启动后:在外部打开网页时,访问被拒绝,但是本地可以curl通过,尝试关闭防火墙,成功
3.7 基于docker镜像启动django容器–uwsgi

  • 创建镜像打包目录,创建Dockerfile
 cd uwsgi_django
 touch Dockerfile
  • dockerfile写入配置文件
 # 指定操作的镜像
FROM web:django
# 指定语言,防止中文日志乱码
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8

ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
# 创建文件夹
# 项目存放路径
RUN mkdir -p /opt/zxq/hello	

# 拷贝文件
# django项目地址
COPY hello	 /opt/zxq/hello

#这句指令相当与:cd django项目
WORKDIR /opt/zxq/hello

EXPOSE 8001

CMD ["uwsgi","/opt/zxq/hello/uwsgi.ini"]

  • 创建镜像
docker build -t uwsgi:django .
  • 启动容器
docker run -it -d -p 8001:8001 --name web_uwsgi --rm uwsgi:django /bin/bash
# 进入容器,id根据实际情况修改
docker exec -it web_uwsgi /bin/bash
uwsgi uwsgi.ini

3.8使用nginx代理django容器

docker run -d -p 443:443 -p 80:80 --name nginx -v /opt/zxq/nginx/dist:/usr/share/nginx/html -v /opt/zxq/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/zxq/nginx/log:/var/log/nginx -v /opt/zxq/nginx/conf.d:/etc/nginx/conf.d -v /opt/zxq/nginx/ssl:/ssl nginx
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/360579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号