-
登录宝塔
不记得地址的情况下:sudo /etc/init.d/bt default
记得地址情况下登(关键是5fdaa1e0):http://192.168.40.128:8888/5fdaa1e0
宝塔Linux面板: 账号:ounei 密码:dxhhxxcs…2016
-
在虚拟机上创建网站并将站点添加到宝塔中
-
在虚拟机上创建网站
-
创建Django网站
# 创建myBlog网站,先创建config项目,然后把最外层的名字改为myBlog django-admin startproject config # 设置所有ip都可以访问 更改settings.py第28行 ALLOWED_HOSTS=["*"] # 启动服务器 python manage.py runserver
-
为网站创建一个虚拟环境,在这个环境内进行包的安装。
python创建虚拟环境和激活:
# 在项目下创建env目录,进入该目录,创建虚拟环境 python -m venv # 激活虚拟环境 source bin/activate
anaconda创建虚拟环境和激活
# 在指定目录下创建名为py38的虚拟环境 conda create --prefix PATH/py38 python=3.8 # 激活虚拟环境 conda activate PATH/py38 # 或者不指定目录,直接按名字创建 conda create -n py38 python=3.8 # 激活py38 conda activate py38 # 退出 deactivate
-
-
将网站添加到宝塔中
-
创建App并项目关联
创建App
python manage.py startapp blog
更改setting.py,在INSTALLED_APPS中添加创建的app与项目进行关联
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', ]
此时启动服务器,进入网站是可正常访问的。
在网址后面加/admin则可进入管理员页面,但需要登录。下面我们就来创建超级管理员
-
-
同步数据库并创建超级管理员
# 同步数据库 python manage.py migrate # 创建超级管理员,输入账号密码 python managy.py createsuperuser
此时可正常登入管理员页面,但页面为英语且时区有问题,下面修改: setting.py文件中
-
LANGUAGE_CODE中修改后台的语言(默认英语): zh-cn => zh-hans
-
修改时间 TIME_ZONE : ‘UTC’ => ‘Asia/Shanghai’
-
-
安装mysql
- 宝塔安装mysql: 软件商店里下载mysql即可,注意mysql和Django的版本是否适配。比如mysql5.5和最新的Django就不适配。
- ubuntu安装mysql
-
创建博客需要的数据表
- 创建表
在blog文件夹下的models.py中新建一个类,类名为Blog, 集成models.Model。 创建博客需要的几个属性。为了快速编写Django代码可以在vscode中安装Django插件(墨绿色底,白色logo)。
from django.db import models # Create your models here. class Blog(models.Model): title = models.CharField(max_length=50, verbose_name="标题") content = models.TextField(verbose_name="文章内容", default="") create_time = models.DateTimeField(auto_now=True, verbose_name="创建时间") count = models.IntegerField(verbose_name="阅读次数", default=True) # 修改后台管理员页面显示的数据库表的名字信息 class Meta: verbose_name = "博客管理" verbose_name_plural = verbose_name def __str__(self) -> str: return self.title
-
添加到后台 在blog文件夹下的admin.py文件
from django.contrib import admin from .models import Blog # Register your models here. @admin.register(Blog) class BlogAdmin(admin.ModelAdmin): list_display= ("title", "create_time","count")
-
同步到数据库
# 记录代码的改动 python manage.py makemigrations # 执行数据库操作 python manage.py migrate
-
编写前端页面以及渲染逻辑
在项目内新建templates文件夹,用于存放html页面。
-
添加页面模板文件夹 修改setting.py文件
将TEMPLATES中的‘DIRS’:[], 修改为DIRS’: [os.path.join(BASE_DIR, “templates”)]
-
在views.py中添加代码,用于用户访问时返回指定页面。
def index(request): return render(request, "index.html")
-
修改urls.py,导入views.py中编写的index方法,将其绑定到首页。
from django.contrib import admin from django.urls import path from blog.views import index urlpatterns = [ path('admin/', admin.site.urls), path('', index, name='index'), ]
-
在templates文件夹中新建一个index.html
<html> <head> <title>我的首页</title> </head> <body> <h1>欢迎来到我的网站!</h1> </body> </html>
此时就可以访问到index中的内容了。
-
在views.py中添加代码,用于在首页显示文章列表并访问文章内容。
from django.shortcuts import render from .models import Blog # Create your views here. def index(request): blogs = Blog.objects.all().order_by("-creat_time") return render(request,"index.html", {'blogs':blogs}) def read_blog(request,id): blog = Blog.objects.get(id) return render(request,'content.html',{'blog':blog})
-
修改urls.py
from django.contrib import admin from django.urls import path from blog import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.index, name='index'), path('read_blog/<int:id>', views.read_blog, name='read_blog') ]
-
修改index.html
<html> <head> <title>我的首页</title> </head> <body> <h1>欢迎来到我的网站!</h1> <ul> {% for blog in blogs %} <li> <a href="{% url 'read_blog' blog.id %}">{{blog.title}}</a> </li> <p>由{{blog.author}}创建于{{blog.creat_time}}</p> {% endfor %} </ul> </body> </html>
-
在templates文件夹中新建一个content.html
<html> <head> <title>{{blog.title}}</title> </head> <body> <a href="/">回到首页</a> <h1>{{blog.title}}</h1> <div> {{blog.content}} </div> <div> 由{{blog.author}}创建于{{blog.creat_time}} </div> </body> </html>
-
部署
-
数据库配置
之前所有的数据库操作都是基于python自带的sqlite3数据库,下面我们该用mysql
-
将数据备份为json文件
python manage.py dumpdata > mysite_all_data.json
-
安装pymysql
pip install pymysql
-
更改setting.py
将
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
更改为
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog', 'USER': 'blog', 'PASSWORD': '你的密码', 'HOST': 'WSL的IP', 'PORT': '3306', } }
-
更改_init_.py
import pymysql pymysql.install_as_MySQLdb()
-
修改宝塔中数据库的访问权限为所有人,然后重启数据库
-
在终端同步数据库设置 python manage.py migrate
-
将之前备份的数据导入mysql中: python manage.py loaddata mysite_all_data.json
-
-
gunicorn配置
-
安装gunicorn: pip install gunicorn
-
在项目根目录新疆名为gunicorn_start.sh的文件,并使用
chmod +x gunicorn_start.sh
赋予该文件可执行权限。#!/bin/bash NAME="MyBlog" DJANGODIR=****/MyBlog #Django project directory 需要修改 USER=****# the user to run as 需要修改 GROUP=****# the group to run as 需要修改 NUM_WORKERS=1 # how many worker processes should Gunicorn spawn DJANGO_SETTINGS_MODULE=config.settings # which settings file should Django use DJANGO_WSGI_MODULE=config.wsgi # WSGI module name echo "Starting $NAME as `whoami`" # Activate the virtual environment cd $DJANGODIR source *****/env/bin/activate #虚拟环境激活 需要修改 export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH # Create the run directory if it doesn't exist RUNDIR=$(dirname $SOCKFILE) test -d $RUNDIR || mkdir -p $RUNDIR # Start your Django Unicorn # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon) exec ****/env/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $NUM_WORKERS \ --user=$USER --group=$GROUP \ --log-level=debug \ --log-file=-
-
网站配置
在项目根目录下新建一个static文件夹,在网站配置文件(宝塔)中加入以下内容:
location /static/ { alias ****/MyBlog/static/; # ****为项目绝对路径 expires max; access_log off; log_not_found off; } location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://127.0.0.1:8000; break; } }
此时访问admin页面的样式会完全丢失
- 在根目录下新建static文件夹,用于存放样式文件
- 修改setting.py, 添加 STATIC_ROOT = BASE_DIR/‘static’
- 收集所有静态文件 python manage.py collectstatic
- 在nginx配置文件中将第一行修改为user *** ***;***替换为用户名。或者也可以将第一行修改为user root root;,直接用root用户。
- 重载并重启nginx. 重新运行./gunicorn_start.sh,再进入admin管理页面,这里因为用了nginx代理,所以不需要输入端口号8000。此时样式完全显示了。
-
suppervisor配置
-
安装suppervisor sudo apt install supervisor -y
-
创建文件并写入以下内容。 sudo vim /etc/supervisor/conf.d/myblog.conf
[program:myblog] command = *******/gunicorn_start.sh user = **** autostart=true autorestart=true redirect_stderr = true stdout_logfile = ****/myblog.log stderr_logfile=****/myblog.err
-
更新 sudo supervisorctl update (如报错可能是log权限不够)
-
-
-
重启nginx即可
-