Django學習

一、Django簡介

Django是一個用python編寫的web框架(MVC架構)版本標有LTS: 長期支持版本

1.MVC設計模式

一種設計模式,用業務邏輯使數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件上,在改進和個性化界面與用戶交互的同時不需要重新編寫業務邏輯。(M:model V:view C:controller)

  • 核心思想: 解耦(更好從組織代碼,1個文件拆成5個文件,可以分攤風險)

  • 優點: 降低各模塊之間的耦合性,方便變更,更容易重構代碼,最大程度實現了代碼的重用

2.MVT設計模式(Django)

本質上和mvc差不多,也是各組件之間為了保持松耦合關系,只是定義不同

  • Model: 負責業務對象與數據庫(ORM)的對象
  • View: 負責業務邏輯,并在適當的時候調用Model和Template,相當于C
  • Template: 負責把頁面展示給用戶

Django里還有一個url分發器(路由),主要用來將一個個url頁面的請求分發給不同的view進行處理,View在調用相應的Model,和Template.

二、Django安裝

  1. 通過pip安裝(Python包管理器) (pip用法
$curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 下載安裝腳本

$sudo -H python get-pip.py --no-wheel    # 運行安裝腳本(加上options忽略wheels)
# 安裝如果出現以下提示加上 --no-wheel
ERROR: Could not find a version that satisfies the requirement wheel (from versions: none)
ERROR: No matching distribution found for wheel
# 驗證安裝
$pip --version
# 卸載
$python -m pip uninstall pip
# 查看指定包的安裝位置
$pip show packageName

注意:用哪個版本的 Python 運行安裝腳本,pip 就被關聯到哪個版本,如果是 Python3 則執行以下命令:

$sudo -H python3 get-pip.py    # 運行安裝腳本
  1. 安裝django (不指定的話,安裝很慢)
$pip install django==1.11.7 -i https://pypi.douban.com/simple/ tornado # 指定版本號 指定鏡像源

# 驗證
$pip list 
  1. 創建項目
$django-admin startproject projectName # 創建項目
$tree # 樹形查看項目結構
$python manage.py startapp appName # 創建一個應用

4.開啟服務

$python manager.py runserver [127.0.0.1:][8000] #啟動服務 - 可以直接寫端口號 - 默認是8000

5.IDE打開要與manager.py同級, 打開projectName項目

三、Django文件解讀

1.settings.py(項目配置)

BASE_DIR  #項目的絕對路徑:也就是根路徑
SECRECT_KEY #秘鑰 - 用于生產環境
DEBUG #調試開關 - 用于開發
ALLOWED_HOSTS = ["*"] #允許訪問的主機
INSTALLED_APPS = [...] #已經安裝的app,django安裝的應用
MIDDLEWARE = [...] #中間件
ROOT_URLCONF = '....urls' #根路由
TEMPLATES #模板
WSGI_APPLICATION #部署用的
DATABASES #數據庫
AUTH_PASSWORD_VALIDATORS #鑒權相關
LAUGUAFE_CODE = 'zh-hans' #語言編碼

2.urls.py(路由)

3.apps.py 應用配置

4.admin.py 后臺管理

5.model.py 數據模型

6.tests.py 寫測試

7.sqlite

  • 輕量級嵌入式數據庫
  • 特點小,常用于Android ios wp
  • 數據庫常規操作和mysql很像
$python3 manage.py migrate # 數據庫遷移

四、路由管理

from django.contrib import admin
from django.urls import path

# 導入view
from App import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/', views.hello),  # 添加路由 - 對應模塊下的方法
    path('html/', views.index)
]

# App/views.py
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def hello(request):
    return HttpResponse('可還行') # 直接響應 - 也可以是html字符串 返回給瀏覽器會直接渲染

def index(request):
    return render(request, "index.html") # 渲染模板文件

五、Model數據模型

Django的models使用了ORM(Object Relational Mapping 對象關系映射)技術,將業務邏輯進行了一個解耦合,在操作數據庫時無需關注什么數據庫,只需要調用對應的對象和方法,就可以映射成對應的sql語句去執行。

相關文章https://www.bbsmax.com/A/KE5QXjPZJL/

1.創建一張表

DDL: 定義數據庫,Django里用models去定義一個數據庫模型 - 表

App/models.py
from django.db import models

# Create your models here.

# 新建一個Sduent模型 - student表
class Student(models.Model):
    name = models.CharField(max_length=16) #設置字段名稱
    age = models.IntegerField(default=1)

然后執行出,表名稱 APP_Student

$python3 manage.py makemigrations # 生成用戶表
$python3 manage.py migrate # 數據庫遷移
2.新增數據
from django.shortcuts import render
from django.http import HttpResponse
import random

# 導入模型
from App.models import Student


# 新增用戶數據
def student(request):
    students = Student()
    students.name = 'tom %d' % random.randrange(90)
    students.save()

    return HttpResponse('success %s' % students.name)
3.查詢數據
from django.shortcuts import render
from django.http import HttpResponse
from django.core import serializers

import random

# 導入模型
from App.models import Student

# 獲取學生數
def getStudent():
    students = Student.objects.all()
    # 返回json序列化
    str_students = serializers.serialize("json", students)

    return HttpResponse(str_students)
// 會返回如下信息
[{
    "model": "App.student",
    "pk": 1,
    "fields": {
        "name": "tom 39",
        "age": 1
    }
}]
4.更新數據
# 更新學生數據
def updateStudent(req):
    # 先查后保存
    student = Student.objects.get(id=1)
    student.name = 'test_update_name'
    student.save()

    return HttpResponse('update success')
5.刪除數據
# 刪除學生數據
def deleteStudent(req):
    student = Student.objects.get(id=1)
    student.delete()

    return HttpResponse('delete success')
6.鏈接mysql數據庫
  1. 首先修改settings.py下的 DATABASES
DATABASES = {
    # mysql
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoStudy', # dbName
        'USER': 'admin',
        'PASSWORD': 'admin',
        'HOST': '127.0.0.1',
        'port': '3306'
    }
}
  1. 安裝mysql驅動

    (1)mysqlclient: 對mysql有要求,需要存在指定位置的配置文件

    (2)python-mysql: 支持python2

    (3) pymysql: 這個都支持--- 常用

  2. 執行shell

$python3 manage.py makemigrations
$python3 manage.py migrate

如果報: raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.version)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

到django /db/mysql下把base.py如下代碼注釋掉:

# base.py
# if version < (1, 3, 13):
#     raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

如果報: query = query.decode(errors='replace') AttributeError: 'str' object has no attribute 'decode'

修改 operations.py, 將decode 修改為 encode

#query = query.decode(errors='replace')
query = query.encode(errors='replace')

如果開啟服務報: raise RuntimeError("cryptography is required for sha256_password or caching_sha2_password") RuntimeE

執行該條命令

$pip install cryptography
7.數據庫操作
  • 外鍵約束
# models.py
from django.db import models

# Create your models here.

# 年級表
class Grade(models.Model):
    name = models.CharField(max_length=32)


# 新建一個Sduent模型 - student表
class Student(models.Model):
    name = models.CharField(max_length=16) #設置字段名稱
    age = models.IntegerField(default=1)
    # 級聯關系 2.0后定義外鍵和一對一的關系時要加上這個參數
    grade_id = models.ForeignKey(Grade, on_delete=models.CASCADE) 
    
    
# 相關參數
on_delete=None,               # 刪除關聯表中的數據時,當前表與其關聯的field的行為
on_delete=models.CASCADE,     # 刪除關聯數據,與之關聯也刪除
on_delete=models.DO_NOTHING,  # 刪除關聯數據,什么也不做
on_delete=models.PROTECT,     # 刪除關聯數據,引發錯誤ProtectedError

models.ForeignKey('關聯表', on_delete=models.SET_NULL, blank=True, null=True)

on_delete=models.SET_NULL,    # 刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空,一對一同理)

models.ForeignKey('關聯表', on_delete=models.SET_DEFAULT, default='默認值')
on_delete=models.SET_DEFAULT, # 刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值,一對一同理)

# views.py
def getGradeName(req):
    student = Student.objects.get(id=3)
    grade = student.grade_id
    print(grade.name) # 二年級 關聯到了grade表

    return HttpResponse(req)

# 通過外鍵查詢所有學生名單
def getStudentsName(req):
    # 先查年級
    grade = Grade.objects.get(name='一年級')
    students = grade.student_set.all()

    return render(req, 'student.html', context={ 'students': students })

六、template模板語法

1.基本語法
# 返回字典對象
return render(request, 'contexts.html', context = { "name": "xiaoming", "age": 12 })
# 這個過程其實是處理好的html字符串返回給客戶端
# 利用loader.get_template('index.html').render(context=context)
  
# html
<h1>{{ name }}</h1>
<h2>{{ age }}</h2>
2.for循環
# 渲染一個列表
 return render(request, 'list.html', context = { "students": students})

# list.html
<!-- 渲染模板列表 -->
<ul>
    {% for student in students %}
       <li>{{ student.name }}</li>
    {% endfor %}
</ul>
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容