我的django学习记录

涉及到的环境

系统:win10
Python版本:3.9
Pycharm版本:PyCharm 2020.3.3 x64
Django版本:3.1.7
Mysql版本:8.0
Navicat 15 for MySQL

前言

好久没更新博客 ,一直在看博客,因为最近要学习的东西实在是有点多,我也没有精力去写博客 ,但是每次我上CSDN上再也没有小红点了,我知道,我该更新更新博客 ,记录下自己的学习了 。

现在是4月1日的22:36分,我开始了这篇博客的撰写。
先分享了最近学了些什么,前端HTML ,CSS,但也是仅仅了解了一下标签什么的,应用的都很少
跟着教程走还有JS和JQery ,但是我没学/(ㄒoㄒ)/~~本着一个往后端发展的想法,我有我的小倔强。但是经历过web继续的学习后,我发现我错了 ,前端的东西还是要学的 ,连一个DIV P A 各种标签都看不懂的话,根本没办法进行前后端的交互,并且到时候学习爬虫分析网页 ,都整不明白,所以被现实教育之后的我,现在放下所谓的倔强 ,潜下心来去学前端代码 。

正文

web学习的深入,我学习到了django框架,哎 ,太烦躁了,我学的教程中的django版本1.x 但是现在的django都已经3.1了,有一些东西发生了不小的变化 ,我在CSDN上找了好多关于Django的教程,但无一例外,都是毕竟老的版本django教程 ,最新的才是2 ,x。就算是有django3.x的教程,也是非常浅显的教你创建项目,还不如官方文档呢!
所以我由我编写的项目作为切入点 ,记录自己学习最新的django3.x
其实,我学习就好了,看看官方文档就可以了 ,为什么要做项目?

感谢老师,长达60s的语音,听的我心yu花ba怒bu放neng。
就是我们学校要参加一个全国大学生设计大赛 ,我想本着以赛督学的想法,利用django搭建一个学生管理系统,大一知识储备匮缺 ,所以参加了解一下流程,项目质量略次 。最重要是一个锻炼自己的机会!

开始了,django项目的创建

Django的学习 ,一定要看这个 ,如果不明白可以给我留言私信,但因为技术有限,仅限下图

Django的创建 ,哎,这个东西,我真的不想写出来 ,像一些博主一样凑字数,我真的是吐了
我就把代码写出来,况且都已经学习到了框架 ,该有些看到报错自行解决问题的能力了,真的想学的人会自己尝试(试一试又不会怀孕)
因为我的项目做了一些了,本着惰性本能 ,我就不重新开始了,直接截图也可以明白!
到后面我会博客紧跟项目,**项目做什么 ,博客就更新什么 。**所以说 ,按照我前面的环境配置好,跟着博客,你也可以可以完成这个项目(我为了学习Django去GitHub上找源码 ,总是因为作者没写清楚依赖,所以源码从来没有跑成过),我能一步步写 ,真的非常适合新手的学习!!!!

创建Django项目和应用
以下都在cmd窗口中运行

django-admin startproject name 创建工程,name换成你要起的名字

python manager.py startapp name 创建子应用,name换成你要起的名字

因为pycharm可以直接创建Django所以 ,其实只需要执行下面的代码,创建应用即可


工程创建好了,我们就可以输入这指令 ,使你的Django运行起来

python manage.py runserver

这样你的Django就跑起来了,但是作为一个汉语为第一语言的人,你怎能忍受住英语的折磨 ,所以你去setting里面修改一下语言

修改成功后 ,在进行一个

python manage.py runserver

这样你看到这个画面,你就是成功了。 祝贺你!!!

ps:现在已经弄好了不好展示出这个界面了,所以偷个懒 ,把当初第一次安装好DJango记录自己的照片拿过来

还有一步很重要,修改你的配置数据库
Django本身自带一个轻量级数据库sqllite
我们把它换成mysql,
首先去工程目录里面找到__init__文件 ,添加下面的代码,并且形成一种惯性思维,修改数据库 ,就要声明它!
代码在这里

import pymysql
pymysql.install_as_MySQLdb()

然后去你的工程目录里面的setting里面找到这个,修改成我这个样子,就可以了

记得在运行前 ,一定要在mysql里面已经创建好对应的库

当你建立好子应用名字之后,一定要去setting文件里面去注册,告诉Django你创建了一个应用程序

始终牢记MVT的流程
M:model(模型模块)
V:views(视图模块)
T:templates(模板模块)
也就是说建立好了工程以后 ,首先去model里面去创建模型(可以暂时理解为数据 ,类就是表名,类里面是字段),记得是在你的app里面
接下来我把我的model文件写出来

model代码

from django.db import models

# Create your models here.
from django.db import models

# Create your models here.
'''
学生信息: 学号int 姓名char 性别char 年龄int 入学年份data 所在专业char 班级char 导员姓名char
考试成绩:考试科目 考试成绩
课程信息:课程名 课程老师 上课教室
'''


# 学生信息
class StdentInformation(models.Model):
    student_id = models.CharField(max_length=30, verbose_name='学号')
    student_age = models.IntegerField(verbose_name='年龄')
    student_name = models.CharField(max_length=100, verbose_name='姓名')
    student_sex = models.CharField(max_length=5, verbose_name='性别')
    start_year = models.CharField(max_length=10, verbose_name='入学年份')
    specialty = models.CharField(max_length=20, verbose_name='所在专业')
    student_class = models.CharField(max_length=10, verbose_name='班级')
    teacher_name = models.CharField(max_length=20, verbose_name='导员姓名')

    def __str__(self):
        return self.student_name

# 考试成绩
class StudentScore(models.Model):
    student_id = models.CharField(max_length=30, verbose_name='学号')
    sub_ject = models.CharField(max_length=10, verbose_name='科目')
    score = models.CharField(max_length=10, verbose_name='成绩')


# 课程信息
class StudentCourse(models.Model):
    student_id = models.CharField(max_length=30, verbose_name='学号')
    sub_name = models.CharField(max_length=10, verbose_name='课程名')
    sub_tcacher = models.CharField(max_length=10, verbose_name='课程老师')
    sub_class = models.CharField(max_length=10, verbose_name='上课教师')


views代码

M弄完了 ,就该弄V了,views
views就是视图的意思,就是编写你的函数 ,在这个里面实现你后端代码逻辑!

from django.shortcuts import render
from django.http import HttpResponse
from querysys.models import StdentInformation


# Create your views here.
def index(request):
    return HttpResponse('hello')


def searchstudent(request):
    
    return render(request, 'test.html')


def lookfor(request):
    student_id = request.POST.get('student_id')
    objects_all = StdentInformation.objects.all()
    try:
        student = objects_all.get(student_id=student_id)
    except Exception as e:
        return HttpResponse('找不到学生信息', e)
    student_name = student.student_name
    context = {
        'student_name': student_name
    }
    return render(request, 'test2.html', context)

可能现在看不懂代码,不过没关系,静下心来分析代码 ,其实逻辑还是很简单的,看愿不愿意看下去
接下来就是设置路由了 url
你得让对应的浏览器请求找到对应的视图
先去你的工程里面找url

重点已经用红色标注了

urlpatterns = [
    path('admin/', admin.site.urls),
    path('querysys/', include('querysys.url')),

]

include引导进了子应用的url。 因为你创建的子应用没有url文件,所以我们自己创建一个文件

里面的代码是

from django.urls import path
from querysys.views import index, searchstudent, lookfor

urlpatterns = [
    path('', index),
    path('searstudent/', searchstudent),
    path('lookfor/', lookfor),
]

先写到这里 ,还会继续更新,紧跟我的项目 。
到4月3日21:52分,我已经开始尝试使用前端模板 ,先给大家展示个样子

好了 ,还会继续更新下去,如果觉得我写的还可以,给我点赞 ,评论,关注吧!我会认真回复每一条评论!!!

最新更新(上方可不看)

之前因为我卡在了部署外链,直到现在才整明白一些 ,要想真正的部署到生产环境上,要解决很多问题,高并发 ,静态动态文件的获取。
因为隔得时间有点久,所以从下面开始,我要开始 重新开始屡屡思路 ,重写这篇文章

为了部署到服务器上,我不得不暂时舍弃了mysql数据库,先用的django自带的sqllite ,正好也适合新手

部署服务器外链的教程源于公众号:大江狗 Python Web与Django开发
Docker的安装
学习本教程前首先我们要安装Docker。菜鸟教程上总结了Docker在各个平台和系统上的安装 ,大家可以参考 。这里总结了下Docker在阿里云Ubuntu系统上的安装过程。步骤看似很多且复杂,但大家只需要一步一步copy和paste命令就行了,整个安装过程很流畅。

以Ubuntu为例

Step 1: 移除之前docker版本并更新更新 apt 包索引

sudo apt-get remove docker docker-engine docker.io
sudo apt-get update

Step 2: 安装 apt 依赖包 ,用于通过HTTPS来获取仓库

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

Step 3: 添加 Docker 的官方 GPG 密钥

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

Step 4: 设置docker稳定版仓库,这里使用了阿里云仓库

sudo add-apt-repository “deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable”
sudo apt-get update

Step 5: 安装免费的docker Community版本docker-ce

sudo apt-get -y install docker-ce

sudo apt-get install -y docker-ce= #该命令可以选择docker-ce版本

Step 6: 查看docker版本及运行状态

sudo docker -v
sudo systemctl status docker

Step 7:本步非必需 。使用阿里云设置Docker镜像加速,注意下面链接请使用阿里云给自己的URL

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{ “registry-mirrors”: [“https://ua3456xxx.mirror.aliyuncs.com ”] }
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
部署一个最简单的Django项目
现在我们要在服务器上利用Docker部署下面一个最简单的Django项目。我们不使用uwsgi和nginx ,数据库也使用默认的sqlite3,只把django放在一个容器里。整个项目结构如下所示,目前该项目放在宿主机(服务器)上 。

mysite1
├── db.sqlite3
├── Dockerfile # 用于生产docker镜像的Dockerfile
├── manage.py
├── mysite1
│ ├── asgi.py
│ ├── init.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── pip.conf # 非必需。pypi源设置成国内 ,加速pip安装
└── requirements.txt # 项目只依赖Django,所以里面只有django==3.0.5一条
注意:Django默认ALLOWED_HOSTS = []为空,在正式部署前你需要修改settings.py, 把它设置为服务器实际对外IP地址 ,否则后面部署会出现错误,这个与docker无关。即使你不用docker部署,ALLOWED_HOSTS也要设置好的 。

第一步:编写Dockerfile ,内容如下:

建立 python3.7 环境

FROM python:3.7

镜像作者大江狗

MAINTAINER DJG

设置 python 环境变量

ENV PYTHONUNBUFFERED 1

设置pip源为国内源

COPY pip.conf /root/.pip/pip.conf

在容器内/var/www/html/下创建 mysite1文件夹

RUN mkdir -p /var/www/html/mysite1

设置容器内工作目录

WORKDIR /var/www/html/mysite1

将当前目录文件加入到容器工作目录中(. 表示当前宿主机目录)

ADD . /var/www/html/mysite1

利用 pip 安装依赖

RUN pip install -r requirements.txt
我们还将pip源设置成了阿里云镜像 ,pip.conf文件内容如下所示:

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
第二步:使用当前目录的 Dockerfile 创建镜像,标签为 django_docker_img:v1 。

进入Dockerfile所在目录,输入如下命令:

根据Dockerfile创建名为django_docker_img的镜像 ,版本v1,.代表当前目录

sudo docker build -t django_docker_img:v1 .

查看镜像是否创建成功, 后面-a可以查看所有本地的镜像

sudo docker images
这是你应该可以看到有一个名为django_docker_img的docker镜像创建成功了,版本v1。

图片
第三步:根据镜像生成容器并运行 ,容器名为mysite1, 并将宿主机的80端口映射到容器的8000端口。

如成功,根据镜像创建mysite1容器并运行 。宿主机80:容器8000。-d表示后台运行。

sudo docker run -it -d --name mysite1 -p 80:8000 django_docker_img:v1

查看容器状态,后面加-a可以查看所有容器列表 ,包括停止运行的容器

sudo docker ps

进入容器,如果复制命令的话,结尾千万不能有空格 。

sudo docker exec -it mysite1 /bin/bash
这时你应该可以看到mysite1容器开始运行了。使用sudo docker exec -it mysite1 /bin/bash即可进入容器内部。

图片
第四步:进入容器内部后 ,执行如下命令

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py runserver 0.0.0.0:8000
这时你打开Chrome浏览器输入http://your_server_ip,你就可以看到你的Django网站已经上线了,恭喜你!

从客户端到Docker容器内部到底发生了什么
前面我们已经提到如果不指定容器网络 ,Docker创建运行每个容器时会为每个容器分配一个IP地址 。我们可以通过如下命令查看。

sudo docker inspect mysite1 | grep “IPAddress”
图片
用户访问的是宿主机服务器地址 ,并不是我们容器的IP地址,那么用户是如何获取容器内部内容的呢?答案就是端口映射。因为我们将宿主机的80端口(HTTP协议)隐射到了容器的8000端口,所以当用户访问服务器IP地址80端口时自动转发到了容器的8000端口 。

注意:容器的IP地址很重要 ,以后要经常用到。同一宿主机上的不同容器之间可以通过容器的IP地址直接通信。一般容器的IP地址与容器名进行绑定,只要容器名不变,容器IP地址不变 。

把UWSGI加入Django容器中的准备工作
在前面例子中我们使用了Django了自带的runserver命令启动了测试服务器 ,但实际生成环境中你应该需要使用支持高并发的uwsgi服务器来启动Django服务 。尽管本节标题是把uwsgi加入到Django容器中,但本身这句话就是错的,因为我们Django的容器是根据django_docker_img:v1这个镜像生成的 ,我们的镜像里并没有包含uwsgi相关内容,只是把uwsgi.ini配置文件拷入到Django容器是不会工作的。

所以这里我们需要构建新的Dockerfile并构建新的镜像和容器。为了方便演示,我们创建了一个名为mysite2的项目 ,项目结构如下所示:

mysite2
├── db.sqlite3
├── Dockerfile # 构建docker镜像所用到的文件
├── manage.py
├── mysite2
│ ├── asgi.py
│ ├── init.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── pip.conf
├── requirements.txt # 两个依赖:django3.0.5 uwsgi2.0.18
├── start.sh # 进入容器后需要执行的命令,后面会用到
└── uwsgi.ini # uwsgi配置文件
新的Dockerfile内容如下所示:

建立 python3.7 环境

FROM python:3.7

镜像作者大江狗

MAINTAINER DJG

设置 python 环境变量

ENV PYTHONUNBUFFERED 1

设置pypi源头为国内源

COPY pip.conf /root/.pip/pip.conf

在容器内/var/www/html/下创建 mysite2 文件夹

RUN mkdir -p /var/www/html/mysite2

设置容器内工作目录

WORKDIR /var/www/html/mysite2

将当前目录文件拷贝一份到工作目录中(. 表示当前目录)

ADD . /var/www/html/mysite2

利用 pip 安装依赖

RUN pip install -r requirements.txt

Windows环境下编写的start.sh每行命令结尾有多余的\r字符,需移除 。

RUN sed -i ‘s/\r//’ ./start.sh

设置start.sh文件可执行权限

RUN chmod +x ./start.sh
start.sh脚本文件内容如下所示。最重要的是最后一句 ,使用uwsgi.ini配置文件启动Django服务。

#!/bin/bash

从第一行到最后一行分别表示:

1. 生成数据库迁移文件

2. 根据数据库迁移文件来修改数据库

3. 用 uwsgi启动 django 服务, 不再使用python manage.py runserver

python manage.py makemigrations&&
python manage.py migrate&&
uwsgi --ini /var/www/html/mysite2/uwsgi.ini

python manage.py runserver 0.0.0.0:8000

uwsgi.ni配置文件内容如下所示 。

[uwsgi]
project=mysite2
uid=www-data
gid=www-data
base=/var/www/html

chdir=%(base)/%(project)
module=%(project).wsgi:application
master=True
processes=2

http=0.0.0.0:8000 #这里直接使用uwsgi做web服务器 ,使用http。如果使用nginx,需要使用socket沟通。
buffer-size=65536

pidfile=/tmp/%(project)-master.pid
vacuum=True
max-requests=5000
daemonize=/tmp/%(project)-uwsgi.log

#设置一个请求的超时时间(秒),如果一个请求超过了这个时间 ,则请求被丢弃
harakiri=60
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose=true
单容器部署 Django + UWSGI
第一步:生成名为django_uwsgi_img:v1的镜像

sudo docker build -t django_uwsgi_img:v1 .
第二步:启动并运行mysite2的容器

启动并运行mysite2的容器

sudo docker run -it -d --name mysite2 -p 80:8000 django_uwsgi_img:v1
第三步:进入mysite2的容器内部,并运行脚本命令start.sh

进入容器 ,如果复制命令的话,结尾千万不能有空格 。

sudo docker exec -it mysite2 /bin/bash

执行脚本命令

sh start.sh
以上两句命令也可以合并成一条命令

sudo docker exec -it mysite2 /bin/bash start.sh
执行后效果如下所示。当你看到最后一句[uWSGI]时,说明uwsgi配置并启动完成。

这时你打开浏览器输入http://your_server_ip ,你就可以看到你的Django网站已经上线了,恭喜你!这次是uwsgi启动的服务哦,因为你根本没输入python manage.py runserver命令 。

故障排查:此时如果你没有看到网站上线 ,主要有两个可能原因:

uwsgi配置文件错误。尤其http服务IP地址为0.0.0.0:8000,不应是服务器的ip:8000,因为我们uwsgi在容器里 ,并不在服务器上。

浏览器设置了http(端口80)到https(端口443)自动跳转, 。因为容器8000端口映射的是宿主机80端口 ,如果请求来自宿主机的443端口,容器将接收不到外部请求 。解决方案清空浏览器设置缓存或换个浏览器。

注意:你会留意到网站虽然上线了,但有些图片和网页样式显示不对 ,这是因为uwsgi是处理动态请求的服务器,静态文件请求需要交给更专业的服务器比如Nginx处理。下篇文章中我们将介绍Docker双容器部署Django+Uwsgi+Nginx,欢迎关注 。

这里是源文件:
链接:https://pan.baidu.com/s/1Zz0t2x9HJIVrwsJbBtIC6Q
提取码:4i04
复制这段内容后打开百度网盘手机App ,操作更方便哦

成品效果

这是我部署的链接:
http://82.156.199.91/

本文版权归QU快排Www.seoGurubLog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▲61910465