Datawhale Django task2

  1. 登录宝塔

    不记得地址的情况下:sudo /etc/init.d/bt default

    记得地址情况下登(关键是5fdaa1e0):http://192.168.40.128:8888/5fdaa1e0

    宝塔Linux面板: 账号:ounei 密码:dxhhxxcs…2016

  2. 在虚拟机上创建网站并将站点添加到宝塔中

    • 在虚拟机上创建网站

      • 创建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则可进入管理员页面,但需要登录。下面我们就来创建超级管理员

  3. 同步数据库并创建超级管理员

    # 同步数据库
    python manage.py migrate
    # 创建超级管理员,输入账号密码
    python managy.py createsuperuser
    

    此时可正常登入管理员页面,但页面为英语且时区有问题,下面修改: setting.py文件中

    • LANGUAGE_CODE中修改后台的语言(默认英语): zh-cn => zh-hans

    • 修改时间 TIME_ZONE : ‘UTC’ => ‘Asia/Shanghai’

  4. 安装mysql

    • 宝塔安装mysql: 软件商店里下载mysql即可,注意mysql和Django的版本是否适配。比如mysql5.5和最新的Django就不适配。
    • ubuntu安装mysql
  5. 创建博客需要的数据表

    • 创建表

    在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
      
  6. 编写前端页面以及渲染逻辑

在项目内新建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>
    
  1. 部署

    • 数据库配置

      之前所有的数据库操作都是基于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即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值