Task2 Django快速搭建一个简单的文章发布发布网站

VScode Django项目插件

  • Pylance
  • Django
  • Live Server

一、Django项目与宝塔站点的绑定

1.1 VScode中创建Django项目

  • ① 进入所创建的Python环境的文件目录,激活当前Python环境
cd pyenv/ # 进入Python环境的目录
source bin/activate
  • ② 创建一个名为config的应用
django-admin startproject config
  • ③ 修改外层的文件夹名为你所要搭建的项目名称,如将config改为MyBlog

之所以需要这样创建,是因为内层配置config与外层项目MyBlog作出区分,这里也可以无需这样,个人开发习惯。

1.2 VScode中创建Django应用

  • cd进入到MyBlog项目里面,并用ls命令确保确保当前目录中是否存在manage.py文件,若存在则可以创建应用
python manage.py startapp myblog
  • ⑤ 查看config中的settings.py文件中,是否添加了当前应用,没有则添加
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myblog', # 若无,则手动添加,将所创建的应用名,依次放置在后面即可
]
Task2 Django快速搭建一个简单的文章发布发布网站_第1张图片

1.3 Django项目与宝塔站点的绑定

  • ⑥ 确保宝塔里面安装了数据库MySQL 8.0(Django3.x需要高版本的MySQL才能连接成功)和http服务器Nginx 1.19
Task2 Django快速搭建一个简单的文章发布发布网站_第2张图片
  • ⑦ 创建网站站点并与Django项目绑定
Task2 Django快速搭建一个简单的文章发布发布网站_第3张图片

二、Django后台编写

2.1 Django创建超级管理员

  • ① 同步数据库后才能创建成果,自己未创建数据表,也需要先同步,因为Django框架中默认会创建一部分数据表
python manage.py makemigrations # 自己创建了数据表,第一次需要执行
python manage.py migrate # 数据迁移命令
  • ② 创建超级管理员
python manage.py createsuperuser

根据提示进行输入。成功后可以看到如下画面:

2.2 Django修改后台语言

LANGUAGE_CODE = 'zh-hans' # LANGUAGE_CODE :语言代码,
TIME_ZONE = 'UTC' # TIME_ZONE:时区
USE_I18N = True
USE_L10N = True
USE_TZ = True

2.3 Django创建表

# 修改 models.py 文件
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="")
    count = models.IntegerField(verbose_name="阅读次数", default=0)
    creat_time = models.DateTimeField(auto_now=True, verbose_name="创建时间")

    class Meta:
        verbose_name = '博客管理' # 单数名
        verbose_name_plural = verbose_name # 复数名

    def __str__(self):
        return self.title

2.4 Django表添加到后台

# 修改 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", "creat_time", "count")

2.5 Django同步到数据库

# Terminal中
python manage.py makemigrations
python manage.py migrate

注意一行一行的输入

三、Django页面编写

3.1 添加页面模板文件夹

在添加 os.path.join(BASE_DIR, "templates")前需要先将os库导入进来

# 修改 settings.py 文件
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

3.2 修改views.py文件

from django.shortcuts import render
# Create your views here.
def index(request):
    return render(request, "index.html")

3.3 修改 urls.py 文件

from os import name
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"),
]

将我们定义的方法引入进来,然后定义好访问什么路径来执行这个方法

3.4 templates文件夹下创建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.creat_time}}p>
            {% endfor %}      
        ul>
    body>
html>
  • 文章详情页面
# 新建 content.html
<html>
    <head>
        <title>我的首页title>
    head>
    <body>
        <a href="/" style="float: right;">回到首页a>
        <h1>{{blog.title}}h1>
        <div>
            {{blog.content}}
        div>
    body>
html>
  • 编写业务逻辑 views.py
def read_blog(request,id):
    print(f"{id}:我是通过前端点击链接来的")
    blog = Blog.objects.get(id=id)
    return render(request, "content.html", {"blog":blog})
    # 多个参数可用locals()
  • 修改 urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path("", index, name="index"),
    path("read/", read_blog, name="read_blog"),
]

四、Django项目部署

4.1 使用宝塔中的MySQL流程

  • ① 在项目环境中安装 pymsql
pip install pymysql
  • ② 修改Settings.py文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog', # 数据库名称
        'USER': 'blog', # 用户名
        'PASSWORD': '你的密码', # 密码
        'HOST': '虚拟机的IP', # 内网IP地址,ip a可查看
        'PORT': '3306', # mysql默认的端口号
    }
}
  • ③ 修改__init__.py文件
import pymysql
pymysql.install_as_MySQLdb()
Task2 Django快速搭建一个简单的文章发布发布网站_第4张图片
  • ④ 修改宝塔中所创数据库的权限或者指定IP,在此执行即可成功
Task2 Django快速搭建一个简单的文章发布发布网站_第5张图片
Task2 Django快速搭建一个简单的文章发布发布网站_第6张图片

4.2 安装两个必要的应用

  • Superivisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启,【Supervisor 使用详解】
deactivate # 退出python虚拟环境,退出后才能安装
sudo apt install supervisor -y
Task2 Django快速搭建一个简单的文章发布发布网站_第7张图片
  • GunicornGreen Unicorn的简称,它是一个 UNIX下的 WSGI HTTP 服务器,它是一个 移植自RubyUnicorn项目的 pre-fork worker模型,【Gunicorn使用介绍】
source pyenv/bin/activate # 激活python环境后安装
pip install gunicorn

4.3 Gunicorn相关配置

  • ① 在Django项目根目录下创建一个gunicorn_start.sh文件
#!/bin/bash
NAME="MyBlog" # 修改处1,Django项目名
DJANGODIR=/home/forget/Desktop/DjangoDemo/MyBlog # 修改处2,Django项目路径
USER=forget # 修改处3,系统用户名,whoami可查询
GROUP=forget # 修改处4,the group to run as ,whoami可查询
NUM_WORKERS=1 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=config.settings # which settings file should Django use,修改处5,Django项目配置名要一致
DJANGO_WSGI_MODULE=config.wsgi # WSGI module name 修改处6,Django项目配置名要一致

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /home/forget/Desktop/DjangoDemo/pyenv/bin/activate # 修改处7,django项目所在的虚拟环境,此处相当于去激活环境 
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 /home/forget/Desktop/DjangoDemo/env/bin/gunicorn  ${DJANGO_WSGI_MODULE}:application \ # 修改处8
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--log-level=debug \
--log-file=-
  • 修改权限,可通过命令,也可通过宝塔来修改
chmod +x gunicorn_start.sh
Task2 Django快速搭建一个简单的文章发布发布网站_第8张图片
  • ③ 运行
./gunicorn_start.sh
Task2 Django快速搭建一个简单的文章发布发布网站_第9张图片

4.4 后台静态样式丢失问题

  • ① 在项目目录下新建一个 static 的文件夹
  • ② 添加静态文件的配置
# 修改 settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static")
  • ③ 运行命令进行后台静态文件收集
python manage.py collectstatic

4.5 配置 Nginx

# 静态文件配置
  location /static/ {
      alias /home/forget/Desktop/DjangoDemo/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;
        }
  }
Task2 Django快速搭建一个简单的文章发布发布网站_第10张图片

4.6 配置 Supervisor

  • 在项目中先创建一个log文件夹,用于储存日志
mkdir log
  • Terminal中输入
sudo vim /etc/supervisor/conf.d/myblog.conf

vim编辑器先按i,此时左下角就会出现INSERT

Task2 Django快速搭建一个简单的文章发布发布网站_第11张图片
  • 并写入如下内容
[program:myblog]
command = /home/forget/Desktop/DjangoDemo/MyBlog/gunicorn_start.sh
user = forget
autostart=true
autorestart=true
redirect_stderr = true
stdout_logfile = /home/forget/Desktop/DjangoDemo/MyBlog/log/myblog.log
stderr_logfile = /home/forget/Desktop/DjangoDemo/MyBlog/log/myblog.err

同样也要修改成为自己的用户名,接着Esc,再按住shift + :,输入wq,写入退出即可

Task2 Django快速搭建一个简单的文章发布发布网站_第12张图片

若需要修改,也可以在宝塔中直接修改

Task2 Django快速搭建一个简单的文章发布发布网站_第13张图片
  • 最后更新一下我们设置的一系列内容
sudo supervisorctl update
sudo supervisorctl reload
Task2 Django快速搭建一个简单的文章发布发布网站_第14张图片

之所以需要创建此,是因为创建后就不需要在前台启动,在后台通过Nginx启动即可。只需要服务器开启即可访问等一系列操作。

你可能感兴趣的:(Datawhale,python,django,mysql)