Django实践以及服务器部署
-
Django的安装以及环境配置可以通过 Django入门与实践 来学习。
常见命令
- 数据库移植
python manage.py makemigrations
python manage.py migrate
- 创建超级管理员
python manage.py createsuperuser
-
启动服务器
python manage.py runserver(默认是8000端口) -
导出数据
python manage.py dumpdata appname > appname.json python manage.py loaddata appname.json -
清空数据库
python manage.py flush -
Django项目环境终端
python manage.py shell -
数据库命令行
python manage.py dbshell -
创建新项目
django-admin startproject project_name -
创建新App
python manage.py startapp app_name
项目结构
Painting
mainapp
init.py
migrations
admin.py
apps.py
forms.py
models.py
serializers.py
tests.py
urls.py
views.py
media
Painting
init.py
settings.py
urls.py
wsgi.py
static
db.sqilte3
manage.py
requirements.txt
-
Painting
-
settings.py:app配置文件。
-
urls.py:URL配置文件,配置页面URL。
-
wsgi.py:python服务器网关接口。
-
-
manage.py:项目与命令行交互,项目管理器。
-
db.sqlite3:数据库
-
media:存储图片,音乐
-
static:存储静态文件,比如.jsp,.html,.css。
-
migrations:数据库移植模块,自动生成。
-
mainapp
-
admin.py:后台管理系统配置
-
apps.py:
-
models.py:数据库建立代码
-
forms.py:表结构代码
-
serializers.py:序列化数据
-
tests.py:自动化测试模块
-
urls.py:前端URL
-
views.py:执行响应的逻辑代码
-
简单小例子
-
建立一个博客系统,需要进行一下代码编码。
-
models.py
class Blog(models.Model): BlogId = models.CharField(max_length=100, primary_key=True) # Id BlogName = models.CharField(max_length=30) # 博客名 Author = models.CharField(max_length=30) # 作者 def __str__(self): return self.BlogId-
serializers.py
class BlogSerializer(serializers.ModelSerializer): class Meta: model = Blog fields = '__all__'-
views.py
class BlogSet(viewsets.ModelViewSet): queryset = Blog.objects.all() serializer_class = BlogSerializer-
myBlog/urls.py
url(r'blog/$',views.BlogSet)-
settings.py
INSTALLED_APPS = ['myBlog'] LANGUAGE_CODE 设置为'zh_hans',也可以设置为'zh-Hans',但是在部署的时候第二个会出错,建议第一个。-
blog/urls.py
url(r'',include('myBlog.urls',namespqce='myBlog)) -
-
以上代码就是建立一个博客系统,没有前端,可以通过
127.0.0.1:8000/blog访问,返回json对象。 -
访问
static/media文件-
settings.pySTATIC_URL = '/static/' MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR,'media') STATIC_ROOT = os.path.join(BASE_DIR,'static') -
blog/urls.pyurl(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}), url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
-
-
以上就是编写简单的博客系统,下面讲解一下将博客系统部署到云服务器上,生产上线。
使用Nginx和Gunicorn部署Django项目
-
满足条件
-
可以通过外网访问的服务器
-
域名(当然没有域名也可以,直接通过IP进行访问)
-
搭建服务器
-
本教程使用的本地环境是Windows10,服务器环境为Ubuntu 16.01(64位)。
安装软件
- 不懂Linux命令的可以先查看一下基本的使用命令。
- 新的服务器的用户是root,我们需要新建一个拥有超级权限的新用户。
#在root下创建一个新用户,wangyufei是用户名
[email protected]:~# useradd -m -s /bin/bash wangyufei
#把新创建的用户加入到超级权限组
[email protected]:~# usermod -a -G sudo wangyufei
#为新用户设置密码
[email protected]:~# passwd wangyufei
#切换到新用户
[email protected]:~# su - wangyufei
#切换成功,注意到root已经变为wangyufei了
[email protected]:~$
-
如果是新服务器的话,需要更新一下系统。
[email protected]:~$ sudo apt-get update [email protected]:~$ sudo apt-get upgrade -
安装软件,用到的软件有
Nginx、Git、pip、Django、virtualenv和Anaconda。#安装Anaconda,找到最新的Anaconda版本https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ #下载 [email protected]:~$ wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.0.1-Linux-x86_64.sh #安装 [email protected]:~$ bash Anaconda3-5.0.1-Linux-x86_64.sh #Linux里面默认的是python2.7,我们需要切换到python3.6 [email protected]:~$ echo 'export PATH="/home/hqy/anaconda2/bin:$PATH"' >> ~/.bashrc [email protected]:~$ source ~/.bashrc #检查一下,看是否是python3.6 [email protected]:~$ python --version #安装Nginx [email protected]:~$ sudo apt-get install nginx #安装git [email protected]:~$ sudo apt-get install git #安装pip [email protected]:~$ sudo apr-get install python3-pip #安装virtualenv [email protected]:~$ sudo pip install virtualenv(可能需要更新pip,使用命令更新) #安装Django sudo pip install django
解析域名
-
将域名和服务器的IP地址绑定后,可以通过域名访问服务器。
启动Nginx服务
-
Nginx是用来处理静态文件请求的,比如说访问一个博客文章的页面时,服务器会收到两种请求:
-
显示文章的详细信息,这些信息保存在数据库中
-
图片、CSS、js等存在服务器某个文件夹下的静态文件。
-
-
前面我们已经安装了Nginx,并且域名已经和IP地址绑定了,运行下面的命令启动Nginx服务:
[email protected]:~$ sudo service nginx start(这里需要注意一下,服务器需要开放80端口,外网才能进行访问)在浏览器输入域名,看到如下页面说明Nginx启动成功了。
部署代码
部署前的配置
-
Django项目中会有一些CSS、JS等静态文件,这个目录通常位于根目录下,命名为static,需要在项目的
settings.py里做一些配置。STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR,'static)#指明静态文件的收集目录为了安全起见,在生产环境下关闭
DEBUG选项以及设置允许访问的域名。DEBUG = False ALLOWED_HOSTS = ['127.0.0.1','localhost','39.105.110.19']ALLOWED_HOSTS是允许访问的域名列表,前两个是本地域名,最后一个是服务器IP地址。项目还会依赖一些第三方python库,为了在服务器上安装,我们需要将全部依赖写入
requirements.txt文件中**本地的虚拟环境,进入项目的根目录,运行pip freeze >requirements.txt命令。E:\Painting> pip freeze > requirements.txt这时项目的根目录下会生成一个requirement.txt的文本文件,里面是项目的所有依赖。
将代码上传到Github
-
这里对于大多数人来说已经很熟悉了。
git add . git commit -m "blog" git push origin master
设置服务器目录结构
-
我的服务器上存放代码的目录结构是这样的:
/home/wangyufei sites/ 39.105.110.19/ env/ #python虚拟环境目录 Painting/ #项目目录运行下面的命令:
[email protected]:~$ mkdir -p ~/sites/39.105.110.19创建虚拟环境,进入到
39.105.110.19目录下,运行virtualenv命令创建虚拟环境:[email protected]:~$ cd ~/sites/39.105.110.19 [email protected]:~/sites/39.105.110.19$ virtualenv --python=python3 env检查一下虚拟环境是否创建成功,运行
ls命令查看,看到env这个文件夹说明虚拟环境创建成功。[email protected]:~/sites/39.105.110.19$ ls env接着从代码仓库把项目拉取下来,
git clone后面的地址换成自己项目的仓库地址。[email protected]:~/sites/39.105.110.19$ git clone https://github.com/wangyufei1006/Painting.git运行
ls命令检查是否拉取成功。[email protected]:~/sites/39.105.110.19$ ls AICopyBook env
安装项目依赖
-
**虚拟环境,再进入到项目根目录,安装项目的全部依赖:
[email protected]:~/sites/39.105.110.19$ source env/bin/activate (env) [email protected]:~/sites/39.105.110.19$ cd Painting/ (env) [email protected]:~/sites/39.105.110.19/Painting$ pip install -r requirements.txt
收集静态文件
-
虚拟环境下继续运行
python manage.py collectstatic命令收集静态文件到static目录下:(env) [email protected]:~/sites/39.105.110.19/Painting$ python manage.py collectstatic
生成数据库
-
虚拟环境下运行
python manage.py migrate命令创建数据库文件:(env) [email protected]:~/sites/39.105.110.19/Painting$ python manage.py migrate
创建超级用户
-
虚拟环境下运行
python manage.py createsuperuser命令创建一个超级用户,方便进入Django管理 后台。(env) [email protected]:~/sites/39.105.110.19/Painting$ python manage.py createsuperuser
配置Nginx
-
先在服务器的
/etc/nginx/sites-available/目录下新建一个配置文件sudo vim 39.105.110.19,文件名设置为域名,写上下面的配置内容:/etc/nginx/sites-available/39.105.110.19 server { charset utf-8; listen 80; server_name 39.105.110.19; #服务器域名 location /static { alias /home/wangyufei/sites/39.105.110.19/Painting/static #指明静态文件存放目录 } location / { proxy_set_header Host $host; proxy_pass http://unix:/tmp/39.105.110.19.socket; #使用Unix套接字,防止端口冲突 } }接下来需要创建一个符号链接,把这个配置文件加入到启用的网站列表中去,被启用网站的目录在
/etc/nginx/sites-enabled/,具体命令如下:(env) [email protected]:~/sites/39.105.110.19/Painting$ sudo ln -s /etc/nginx/sites-available/39.105.110.19 /etc/nginx/sites-enabled/39.105.110.19
使用Gunicorn
-
Gunicorn一般用来管理多个进程。
-
在虚拟环境下,安装Gunicorn:
(env) [email protected]:~/sites/39.105.110.19/Painting$ pip install gunicorn -
用Gunicorn启动服务器进程:
(env) [email protected]:~/sites/39.105.110.19/Painting$ gunicorn --bind unix:/tmp/39.105.110.19.socket Painting.wsgi:application浏览器输入域名,可以看到访问成功了。
注意:此时如果访问到的还是Nginx的欢迎界面,需要删除/etc/nginx/sites_available/default和/etc/nginx/sites_enabled/default。
自启动Gunicorn
-
现在Gunicorn是我们手动启动的,万一哪天服务器重启了我们又得手工启动。为此写一个脚本,当服务器重新启动后,脚本会帮我们重启Gunicorn,按Ctrl+c停止服务器进程。
写一个启动脚本,脚本位于
/etc/init目录下,且脚本文件名必须以.conf结尾:/etc/init/gunicorn-39.105.110.19.conf start on net-device-up #在服务器联网时才启动gunicorn stop on shutdown respawn #重启gunicorn setuid wangyufei #用户名 chdir /home/wangyufei/static/39.105.110.19/Painting #进入到指定目录 exec ../env/bin/gunicorn --bind unix:/tmp/39.105.110.19.socket Painting.wsgi:application #执行进程通过
start命令启动gunicorn:sudo start gunicorn-39.105.110.19以后代码更新了,只要运行下面的命令重启一下Nginx和Gunicorn可以使新的代码生效了:
sudo service nginx reload sudo restrt gunicorn-39.105.110.19
-
还有另外一种方法也可以实现自启动:
# 新建目录
sudo mkdir -p /usr/lib/systemd/system
# 新建自启动的服务文件
sudo vim /usr/lib/systemd/system/39.105.110.19.service
[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的用户
User=wangyufei
# 你的目录
WorkingDirectory=/home/wangyufei/sites/39.105.110.19/Painting
# gunicorn启动命令
ExecStart=/home/wangyufei/sites/env/bin/gunicorn --bind unix:/tmp/39.105.110.19.socket Painting.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 启动服务
sudo systemctl start 39.105.110.19
# 添加服务到开机自动运行
sudo systemctl enable 39.105.110.19.service
# 查看进程,看看gunicorn是否已经启动,有两个进程
ps -ef | grep gunicorn
好了,基本的部署到生产中已经完成了,可以通过域名或者IP地址访问了。不懂的欢迎大家留言或者查看我的项目代码。
Github欢迎star。