Django Web框架的使用(python)

1、Django框架的使用

1.1、安裝Djnago Web框架

使用pip安裝,命令如下

pip install django == 2.2   # 安裝 2.2版本的Django

1.2、什麼是virtualenv及windows下如何配置

virtualenv是一個創建隔絕的Python環境的工具。virtualenv創建一個包含所有必要的可執行文件的文件夾,用來使用Python工程所需的包。簡單的說就是一個隔絕的python環境,在開發不同的程序的時候,往往需要在不同的環境下開發,每個應用可能需要各自一套"獨立"的運行環境, virtualenv就是爲此而生,用來創建一套這樣的"隔離"的運行環境. virtualenv其操作簡單,在大多數IDE中能容易的嵌合。最簡單的說法就是Virtualenv 是Python中的虛擬環境管理工具。

windows下如何配置virtualenv,參考這篇文章

1.3、創建Django項目

1.31、使用django-admin命令創建項目

django-admin startproject demo

創建完成後,有以下幾個文件

在這裏插入圖片描述

文件說明

文件 說明
manage.py Django程序執行入口
db.sqlite3 SQlite的數據庫文件,Django默認使用這種小型數據庫存取數據,非必須保留
template Django生成的HTML模板文件夾,我們也可以在每個App中使用模板文件夾
demo Django生成的和項目同名的配置文件夾
setting.py Django總的配置文件,可以配置App、數據庫、中間件等選項
urls.py Django默認的路由配置選項
wsgi.py Django實現的WSGI接口的文件,用來處理Web請求

1.32、運行項目

使用以下命令

python manage.py runserver

然後根據提示可得web服務器已經在監聽8000端口的請求。在瀏覽器中輸入http:/127.0.0.1:8000就可以看到創建的Django項目界面。

1.33、創建數據表及賬號密碼

使用以下命令

python manage.py migrate                             # 執行數據庫遷移生成的數據表
python manage.py createsuperuser                     # 按照提示輸入賬號密碼,密碼強度符號一定要求

然後重啓啓動服務器,在瀏覽器中訪問http:/127.0.0.1:8000/admin,使用剛剛創建的賬號密碼就可以登入後臺

1.4、創建App

在命令行使用以下代碼

python manage.py startapp app1

在這裏插入圖片描述
demo目錄裏會多了app1目錄
在這裏插入圖片描述
Django項目中App目錄的文件說明

文件 說明
migrations 執行數據庫遷移生成的腳本
admin.py 配置數據庫遷移生成的腳本
apps.py 單獨配置添加的每個App的文件
models.py 創建數據庫數據模型對象的文件
tests.py 用來編寫測試腳本的文件
views.py 用來編寫視圖控制器的文件

接下來將創建的APP添加到demo目錄下的setting.py配置文件裏,將其激活(否則APP目錄不生效)
激活命令如下

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
]

1.5、數據模型(models)

1.51、在App中添加數據模型

在app1的models.py中添加以下代碼

from django.db import models

# Create your models here.


class Person(models.Model):
    
    """
    編寫Person模型類,數據模型應該繼承models.Model或者其子類
    """
    # 第一個字段使用models.CharFiles類型
    first_name = models.CharField(max_length=30)
    # 第二個字段使用models.CharFiles類型
    last_name = models.CharField(max_length=30)

Person模型中的每一個屬性都指明瞭models下面的一個數據類型,代表了數據庫中的一個字段。上面的類在數據庫中會創建以下的表:

    CREATE TABLE myapp_person (
            "id" serial NOT NULL PRIMARY KEY,
            "first_name" varchar(30) NOT NULL,
            "last_name" varchar(30) NOT NULL
            );

1.52、執行數據庫遷移

在完成數據庫模型的建立後,我們希望使用mysql數據庫,而不是Django自帶的SQLite數據庫。我們要使用MySql數據庫,需要進行一下操作
1、進行setting.py配置
把下面代碼註釋掉

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  }
 }

然後再添加下面代碼

DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'demo',   # 數據庫名稱
        'USER': 'root',     # 用戶名
        'PASSWORD': '密碼',
    }
}

2、連接mysql數據庫,然後在mysql命令行中創建數據庫

create database demo default character set utf8;

3、安裝數據庫驅動

pip install pymysql

4、在D:\Python\Webprojects\l_env\Scripts\demo\demo目錄下的__init__.py文件的手行添加下面代碼

import pymysql
pymysql.install_as_MySQLdb()  # 爲了將pymysql發揮最大數據庫操作性能

5、生成遷移文件

python manage.py makemigrations     

這邊報錯

raise improperlyconfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % database._version_)

然後在D:\Python\Webprojects\l_env\Lib\site-packages\django\db\backends\mysql目錄下找到base.py文件,然後將下面代碼註釋

#if version < (1, 3, 3):
#    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

然後繼續嘗試又報錯

File “%s\django\db\backends\mysql\operations.py”, line 146, in last_executed_query
query = query.decode(errors=‘replace’)

在同樣的目錄下,找到\operations.py文件,
註釋下面2行代碼

#if query is not none:
#  query = query.decode(errors='replace')

6、遷移數據庫,創建新表

python manage.py migrate

報錯raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc
原因:
Django2.1不再支持MySQL5.5,必須5.6版本以上

查mysql版本和Django版本:
show version()
import django
解決辦法
二選一

(1)Django降級到2.0

pip install Django==2.0.0 -i https://pypi.douban.com/simple
(2)MySQL升級

參考:http://www.cnblogs.com/yebaofang/p/9863678.html

1.53、瞭解Django數據API

這裏所有的命令都是在Django的交互命令行中執行。
在項目根目錄下,啓用交互命令行

python manage.py shell

導入數據模塊

from app1.models import Person, Order  # 導入Person, Order模塊

創建數據方法1

 p = Person(first_name="hugo",last_name="張") 
 p.save() # 必須調用save()才能寫入數據庫

方法2

p = Person.objects.create(first_name="hugo",last_name="張")

查詢數據方法

 Person.objects.all()   # 查詢所有數據

 Person.objects.get(first_name="hugo") # 查詢單個數據,get方法只能返回一個確定值

查詢指定條件的數據

Person.objects.filter(first_name__exact="hugo")   # 指定first_name字段值必須爲hugo
Person.objects.filter(first_name__iexact="hugo")   # 不區分大小寫

Person.objects.filter(id_get=1)      # 查找所有id值大於1
Person.objects.filter(id_lt=100)     # 查找所有id值小於100

# 排除所有創建時間大於現在的時間的,exclude的用法與filter正好相反
Person.objects.exclude(created_at__gt=datetime.datetime.now(tz=datetime.timezone.utc))
# 過濾出所有first_name中包含h的字段,然後將查詢結果按照id進行排序
 Person.objects.filter(first_name__contains="h").order_by('id')
  # 查詢所有first_name中不包含h的字段
 Person.objects.filter(first_name__icontains="h").order_by('id')

修改數據前需要先查詢數據

p = Person.objects.get(first_name="hugo")

然後開始修改數據

p.first_name = "john"
p.last_name = "wang"
p.save()
或者
p, is_created = Person.objects.get_or_create(
	first_name = "hugo",
	defaults={"last_name":"wr"}
)

刪除數據同樣需要先找到對應的數據,然後進行刪除

Person.objects.get(id=1).delete()
(1,({'app1.Person':1}))

一般情況我們不會直接刪除數據,而是在數據模型定義的時候加個status參數,值爲True或者False,用來標記是否可用,True爲可用

1.6、路由(urls)

1.61、Django的URL路由流程如下

1、Django查找全局urlpaterns變量(urls.py)
2、按先後順序對URL逐一匹配urlpaterns每個元素
3、匹配到第一個時停止查找,然後執行對應的處理函數
4、如果沒有匹配到或出現異常,則由Django進行錯誤處理

1.62、Django支持的3種表達格式

1、精確字符串格式,如articles/1/。
一個精確URL匹配一個操作函數;最簡單的形式,適合對靜態URL的響應;URL字符串以“/”結尾,而不是開頭。
2、Django的轉化格式:<類型:變量名>,如articles/<int:year>/
Django轉化後的格式是一個URL的模板,匹配URL的同時在其中獲得一批變量作爲參數是一種常用的形式。目的是通過URL進行參數的獲取和匹配
格式轉化類型說明表

格式轉化類型 說明
str 匹配除分隔符(“/”)外的非空字符,默認類型<year>等價於<str.year>
int 匹配0和正整數
slug 匹配字母、數字、橫杆、下劃線組成的字符串,str子集
uuid 匹配格式化的UUID(UUID,通用唯一識別碼,是由一組32位數的16進制數字所構成,可以產生一個號稱全球唯一的ID,可以用來命名文件、變量以及數據庫的ID主鍵等屬於唯一的元素。)
path 匹配任何非空字符串,包括路徑分隔符,是全集

1.63、Django支持正則表達式格式

這種情況下,前面必須是re_path函數,表達式必須是str格式,有2種使用形式
1、不提取參數:如“re_path(articles/([0-9]{4})/)”,表示4位數字,每一位都是0到9的任意數字
2、提取參數:命名格式爲“(?p<name>pattern)”,如“re_path(articles/(?p<year>)[0-9]{4}/)”,將正則表達式提取的4爲數字,每一位都是0-9的任意數字,命名爲year。
未完待續。。。。。。

1.7、表單(forms)

在app1的文件下創建forms.py文件,添加下面代碼

from app1 import views as app1_views
from django.urls import path, include
urlpatterns = [

    path('get_name', app1_views.get_name)
]

在views.py中編寫

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from app1.forms import PersonForm
# Create your views here.


def get_name(request):
    # 判斷請求方法是否爲POST
    if request.method == 'POST':
        # 將請求數據填充到PersonForm實例中
        form = PersonForm(request.POST)
        # 判斷form是否爲有效的表單
        if form.is_valid():
            # s使用form.cleaned_data獲取請求數據
            first_name = form.cleaned_data_data['first_name']
            last_name = form.cleaned_data_data['last_name']
            # 響應拼接後的字符串
            return HttpResponse(first_name + '' + last_name)
        else:
            return HttpResponseRedirect('/error/')
    # 請求GET方法
    else:
        return render(request, 'name.html', {'from': PersonForm})

把URl添加到按app1/urls.py中

path('get_name', app1_views.get_name)

在demo/urls.py中添加

path('app1/',include('app1.urls'))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章