1. 程式人生 > 實用技巧 >Django02 - 入門2

Django02 - 入門2

一:django目錄介紹

- django001:			專案名
    - app01:			app名字
        migrations:		資料庫變更相關記錄
        admin.py:		後臺管理
        apps.py:		app的相關配置
        models.py:		資料庫相關
        tests.py:		測試相關
        views.py:		檢視函式

    - django001:		和專案名同名的目錄
        settings.py:	配置檔案
        urls.py:		總路由
        wsgi.py:		wsgi伺服器配置

    - templates:		模板檔案(一堆HTML)
    
    - manage.py:		啟動專案、建立app、各種命令的操作

二:app介紹

app就是一個獨立的功能,一個包

1.建立app

python3 manage.py startapp app名字

2.作用

沒有app,完全可以(一般情況下,1個專案,至少有1個app)

多個app的作用:區分不同的功能(例如:淘寶有 使用者相關功能、商品相關功能、訂單相關功能,可以放在不同app中)

  • 解耦合,把類似的功能寫到一起,組成一個app

3.建立第二個app

python3 manage.py startapp 第二個app名字

4.app的註冊

方式1:

'app01.apps.App01Config'

方式2:

'app01'

三:django的啟動方式

1.方式1 - PyCharm

點選執行

如果不行,就進行如下設定

2.manage.py

python3 manage.py runserver 127.0.0.1:8000

python3 manage.py runserver 8000				# 不指定IP地址,預設就是本地地址 

python3 manage.py runserver 0.0.0.0:8000		# 外部網路亦可訪問

3.django的socket

在django中,預設情況下,使用的socket是wsgiref,效能很低,僅用於測試

真正後期上線的時候,需要使用效能更高的web伺服器:uwsgi

瞭解:cgi, fastcgi, wsgi, uWSGI, uwsgi, wsgiref

四:配置檔案詳解

import os

# BASE_DIR:專案的根路徑
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# SECRET_KEY:金鑰,專案中預設的一些加密 會用到它(可以改,但不能刪)
SECRET_KEY = 'ov7178+j+$e4x$_vui@f1)o@ymm963-96^%6zh+spq-yy2ws@*'

# DEBUG:除錯模式,開發階段是True,上線階段是False。
# 如果設定成True的話,可以看到響應的提示和路徑,報錯資訊更完善。
DEBUG = True

# ALLOWED_HOSTS:上線階段使用,允許誰訪問,*表示全部
ALLOWED_HOSTS = []

# INSTALLED_APPS專案所有的app,是一個列表,新增的app就是在這裡註冊的
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]

# MIDDLEWARE:中介軟體
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# ROOT_URLCONF:根路由的檔案地址,位置是可以改變的
ROOT_URLCONF = 'django001.urls'

# TEMPLATES:模板檔案存放路徑
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]	# 重點看這裡,這個路徑是一個列表,django-admin建立的django專案,需要手動配置
        ,
        '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',
            ],
        },
    },
]

# WSGI_APPLICATION:wsgi伺服器使用的是哪個
WSGI_APPLICATION = 'django001.wsgi.application'

# DATABASES:資料庫連線配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# AUTH_PASSWORD_VALIDATORS:一些模組,內建模組、內建app相關
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# 國際化相關:語言和時區
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

# STATIC_URL:靜態檔案配置相關
STATIC_URL = '/static/'

重點

1.資料庫

2.靜態檔案相關

3.根路由

4.模板檔案

5.是否是除錯模式

6.app是否註冊

五:路由簡單入門

路由:地址 與 檢視函式 的對映關係 —— uels.py

# urlpatterns列表:列表內放了url函式的執行結果
# 使用很簡單,複製一行,改一下第一個引數(帶有正則表示式的路徑)和第二個引數(對應的檢視函式記憶體地址)
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 在內部,請求來了,路徑匹配成功,內部自動呼叫index(request),把request傳入
    url(r'^index/', view.index),
]

六:檢視簡單入門

1.檢視函式:views.py

可以不放在views.py中,但是通常放在裡面

2.請求物件

  • request.method —— get、post

  • request.GET —— 當做字典來用

  • request.POST —— post形式傳遞的引數

post請求可不可以在請求地址中攜帶資料?

可以

# request必須傳,約定俗稱都使用request
# request是一個物件,請求的物件。請求過來的是符合HTTP協議的資料包(字串)
# django把HTTP請求,拆分、封裝到看request物件中
# 拆HTTP:1.字串拆成字典(wsgiref做的)2.封裝到request物件中
# request物件中一定有檔次HTTP請求的所有東西:請求地址、請求方式、請求頭、請求體
def index(request):
    # 1.請求方式(常用:GET、POST)瀏覽器位址列中發出的都是GET請求
    print(request.method)

    # 2.請求的引數:get請求是這種形式:http://127.0.0.1/index?name=Darker&age=18
    print(request.GET)          # 把它當成字典
    # print(request.GET.get('name'))
    print(request.GET['name'])  # 可能會報錯,所以推薦用get取值
    # print(request.GET.get('age'))

    # 3.POST形式提交的資料(資料存放在請求體(body體)中)
    print(request.POST)         # 把它當成字典


    return HttpResponse('OK')

3.響應物件

① HttpResponse(一個類):返回字串形式

return HttpResponse('<h1>Hello World</h1>')

② render(一個函式,返回HttpResponse的物件):返回模板檔案

return render(request, 'index.html')

③ redirect(一個函式,返回HttpResponse的物件):重定向

return redirect('/index')
return redirect('http://www.xuexianqi.top')

七:靜態檔案配置

靜態檔案:jscssimg

1.去settings.py中配置

# 靜態檔案配置相關
STATIC_URL = '/static/'

# 再配一個 STATICFILES_DIRS=列表(列表內寫路徑)
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),  # 真實的靜態檔案路徑
)

2.新建一個static資料夾

在該資料夾下,新建:imgcssjs資料夾。

以後,在相應的目錄,放相應的程式碼。

3.在模板的HTML中使用

<script src='/static/jquery.js'></script>

4.靜態檔案的本質

STATIC_URL = '/static/'其實就是開了一個隱藏的路由

八:簡單的登入功能

路由

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^$', views.login),
    url(r'^index/', views.index),
]

檢視函式

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 建立資料庫連線
        conn = pymysql.connect(
            host='127.0.0.1',
            user='root',
            database='userinfo',
            port=3306
        )
        # 拿到1個遊標
        cursor = conn.cursor()
        # 執行sql
        cursor.execute('select * from user where username=%s and password=%s', (username, password))
        # 獲取結果
        ret = cursor.fetchone()
        print(ret)
        if ret:
            # return redirect('/index')
            return render(request, 'index.html')
        else:
            return HttpResponse('賬號或密碼錯誤!')


def index(request):
    return render(request, 'index.html')

九:MTV與MVC

MVC架構 - 主流的web框架

Web伺服器開發領域裡著名的MVC模式,所謂MVC就是把Web應用分為模型(M),控制器(C)和檢視(V)三層,它們之間以一種外掛式的、鬆耦合的方式連線在一起,模型負責業務物件與資料庫的對映(ORM),檢視負責與使用者的互動(頁面),控制器接受使用者的輸入呼叫模型和檢視完成使用者的請求。

Web應用分為模型(M)、檢視(V)、控制器(C)
  • M - Model:資料庫相關操作
  • C - Controler:控制器,邏輯相關,邏輯程式碼
  • V - View:檢視,模板檔案

MVT架構 - Django的框架

Django的MTV模式本質上和MVC是一樣的,也是為了各元件間保持鬆耦合關係,只是定義上有些許不同

  • M - Model(模型):資料庫相關操作,負責業務物件和資料庫的關係對映(ORM)
  • T - Template(模板):(就是MVC的V層)負責如何把頁面展示給使用者(html)
  • V - View(檢視):(路由+V=MVC的控制器)負責業務邏輯,並在適當時候呼叫Model和Template

除了以上三層之外,還需要一個URL分發器,它的作用是將一個個URL的頁面請求分發給不同的View處理,View再呼叫相應的Model和Template,MTV的響應模式如下所示

一般是使用者通過瀏覽器向我們的伺服器發起一個請求(request),這個請求回去訪問檢視函式,(如果不涉及到資料呼叫,那麼這個時候檢視函式返回一個模板也就是一個網頁給使用者)。

檢視函式呼叫模型,模型去資料庫查詢資料,然後逐級返回,檢視函式把返回的資料填充到模板中空格中,最後返回網頁給使用者。

十:django請求生命週期

同步框架的併發量:峰值 - 300

0.近幾年Python中的幾個框架:Sanic、FastAPI(非同步框架)

1.Python中的web伺服器都符合wsgi協議

2.web伺服器

任何語言都會有一個web伺服器,負責把HTTP請求轉換成這門語言的變數

Python:wsgiref(效能很低)、uwsgi(C語言寫的),200多併發量

Java:Tomcat、jboss(300多併發量)

PHP:php伺服器

3.django生命週期

十一:虛擬環境講解,pycharm配置

虛擬環境詳解:http://www.xuexianqi.top/archives/126.html

1.虛擬環境的作用

隔離專案,每個專案有自己依賴的模組和包。不同的模組和包的版本就不會相互影響。

2.PyCharm中配置虛擬環境

十二:ORM概述

1.什麼是ORM?

Object Relational Mapping,簡稱ORM,是物件關係對映(和語言無關)

資料庫中的表 - 對應程式的一個類

資料庫中的一行資料 - 對用程式中的一個物件

2.Python中常見的ORM框架

Django的ORM框架

sqlachemy ORM框架

3.Java:(擴充套件),Java中寫web框架

ssh框架:spring + structs(有漏洞) + hibernate(ORM框架)
ssm框架:spring + springMVC + mybatis(ORM框架,可以寫原生sql)
springboot:sb框架(全家桶),內建了Tomcat
springcould:微服務

4.ORM可以做的事

  • 建立表(但是不能建立資料庫,只能手動建立資料庫)
  • 增加刪除表內欄位
  • 增刪改查資料

十三:django中orm的使用

1.建立UserInfo表 - 在models.py中寫一個類

2.表中有欄位(類屬性)

第一步:models中書寫類

from django.db import models


# 一定要繼承
class UserInfo(models.Model):
    # 欄位屬性==》由後面的物件決定
    # 該欄位自增,並且是主鍵
    id = models.AutoField(primary_key=True)
    # 該欄位是varchar型別,長度是32(唯一約束,是否是索引,預設值是什麼,是否可以為空)
    name = models.CharField(max_length=32)
    # 密碼欄位
    password = models.CharField(max_length=64)

第二步:執行資料遷移命令

python3 manage.py makemigrations	# 會在migrations資料夾下建立一條記錄
python3 manage.py migrate