我的django學習記錄
- 涉及到的環境
- 前言
- 正文
- 開始了,django專案的創建
- model代碼
- views代碼
- 最新更新(上方可不看)
- 以Ubuntu為例
- Step 1: 移除之前docker版本并更新更新 apt 包索引
- Step 2: 安裝 apt 依賴包,用于通過HTTPS來獲取倉庫
- Step 3: 添加 Docker 的官方 GPG 密鑰
- Step 4: 設定docker穩定版倉庫,這里使用了阿里云倉庫
- Step 5: 安裝免費的docker Community版本docker-ce
- sudo apt-get install -y docker-ce= #該命令可以選擇docker-ce版本
- Step 6: 查看docker版本及運行狀態
- Step 7:本步非必需,使用阿里云設定Docker鏡像加速,注意下面鏈接請使用阿里云給自己的URL
- 建立 python3.7 環境
- 鏡像作者大江狗
- 設定 python 環境變數
- 設定pip源為國內源
- 在容器內/var/www/html/下創建 mysite1檔案夾
- 設定容器內作業目錄
- 將當前目錄檔案加入到容器作業目錄中(. 表示當前宿主機目錄)
- 利用 pip 安裝依賴
- 根據Dockerfile創建名為django_docker_img的鏡像,版本v1,.代表當前目錄
- 查看鏡像是否創建成功, 后面-a可以查看所有本地的鏡像
- 如成功,根據鏡像創建mysite1容器并運行,宿主機80:容器8000,-d表示后臺運行,
- 查看容器狀態,后面加-a可以查看所有容器串列,包括停止運行的容器
- 進入容器,如果復制命令的話,結尾千萬不能有空格,
- 建立 python3.7 環境
- 鏡像作者大江狗
- 設定 python 環境變數
- 設定pypi源頭為國內源
- 在容器內/var/www/html/下創建 mysite2 檔案夾
- 設定容器內作業目錄
- 將當前目錄檔案拷貝一份到作業目錄中(. 表示當前目錄)
- 利用 pip 安裝依賴
- Windows環境下撰寫的start.sh每行命令結尾有多余的\r字符,需移除,
- 設定start.sh檔案可執行權限
- 從第一行到最后一行分別表示:
- 1. 生成資料庫遷移檔案
- 2. 根據資料庫遷移檔案來修改資料庫
- 3. 用 uwsgi啟動 django 服務, 不再使用python manage.py runserver
- python manage.py runserver 0.0.0.0:8000
- 啟動并運行mysite2的容器
- 進入容器,如果復制命令的話,結尾千萬不能有空格,
- 執行腳本命令
- 成品效果
涉及到的環境
系統: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/(服務器快要到期了)
http://82.156.57.249/(最新部署的鏈接)
我把后臺賬號密碼公布出來,你可以自行發揮啊,哈哈哈哈哈,搞點破壞???
賬號:admin
密碼:admin
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286310.html
標籤:python
上一篇:最強Python/R/D3.js可視化資料(代碼全部免費送)
下一篇:爬蟲學習 ----- 第二章 爬取靜態網站 ---------- 01 . re 模塊學習 ---- python的re庫
