目錄html
以前咱們介紹了Django的安裝和建立,以及其基本原理,接下來咱們就逐步介紹Django裏面常見的一些東西,如下三種一般都是用來做爲返回值的.前端
用來返回字符串python
return HttpResponse('hello world~') # 會返回一個字符串,即屏幕上只會剩下這一個字符串,用處比較有限,不過也算有用
用來返回一個網頁,這個用處比較大,好比mysql
def reg(request): return render(request,'reg.html') # request的用處咱們在下面會介紹,這個例子的意思就是最終會返回一個reg.html網頁,一般咱們在瀏覽網頁的時候,網頁之間的切換也許會用到這個,也許不會,這只是一種選擇.
重定向,重定向的概念咱們在以前介紹http協議的時候介紹過,因此咱們定義重定向的話能夠直接將當前網頁轉到重定向後的網頁.sql
def home(request): return redirect('https://baidu.com') # 即在觸發了這個函數以後就會直接跳向重定向的網頁
網站所用到的靜態文件一般包括如下幾類,即本身寫好的JS,本身寫好的CSS或者咱們所引用的第三方框架,bootstrap,fontwesome,sweetalert等等.數據庫
在以前咱們瞭解到,在引入第三方框架的時候咱們能夠選擇用cdn在線緩存的文件,或者本身下載下來,用本地的靜態文件.這裏咱們選擇用靜態文件,而後就須要把這些靜態文件統一放在一個文件夾裏面,一般咱們會放在一個新建的名爲static的文件夾裏,約定俗成的,沒什麼道理.django
可是要注意的一點是,在咱們把全部的靜態文件都扔到文件夾裏以後,Django並不能很準確的去識別這個路徑,就算咱們在html界面裏用根目錄來引用這些文件也不行,Django自己找不到,因此,咱們要配置一下路徑bootstrap
配置靜態文件的訪問資源是在根目錄下的settings.py
文件裏,在最後咱們會看到後端
# settings.py文件的最下方 STATIC_URL = '/static/' # 這是咱們訪問靜態資源的接口前綴,很重要,就是咱們輸網址的時候要寫的接口前綴 # 而後咱們須要在這個語句下面加上這樣一個配置項 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), # 拼接路徑名 ]
在添加好路徑以後,咱們在html文件引入方式也須要改變,以下:瀏覽器
# **.html文件,<head>在這裏面添加如下語句</head> {% load static %} <link rel="stylesheet" href="{% static '靜態文件所在地址'%}"> # 這樣都配置過以後,咱們才能正確的引入這些靜態文件,並正確引用他們.
form表單是咱們熟悉前端的時候學到的東西,其標準格式以下
<form action="" action="" method="post"> # action參數能夠寫的是: 1. 空着,會默認向當前頁面的地址提交 2. 只寫後綴,如/index,/admin等,則會在前面自動拼接上當前的網址和端口,而後拼接上所寫的後綴 3. 寫全路徑 # method參數,默認是get,還能夠寫post 咱們要知道這二者的區別,get,當咱們輸入網址,進入網址的時候,此時服務端是已經收到了一個get請求的,因此咱們才能接收到一個網頁,這個網頁就是服務端對於咱們的get返回的一個返回值,可是get請求自己是有一些問題的,主要體如今如下兩點: 1. get請求不安全,由於get請求在攜帶參數的時候是直接在url?後面添加的,好比?username=admin&password=159789 因此這種狀況下,若是是輸入的帳號密碼而後發送一個get請求,是很是不安全的 2. get請求所能攜帶的參數是有長度限制的,根據每一個瀏覽器的不一樣,都會有不一樣長度的限制 # 在瞭解了以上內容以後,若是咱們想要提交post請求,除了把method裏面參數改爲post以外,還須要註釋掉一個語句,這個語句對於咱們初學者來講沒有用處,還會影響整個項目的運行. # 其位置仍然在settings.py文件裏,咱們須要注掉的就是'django.middleware.csrf.CsrfViewMiddleware'這個語句 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', ]
requests是咱們寫每個views方法的時候都會在括號裏傳的參數,其最大的做用就是負責前端和後端數據的交互,後端所收到的前端的信息幾乎全都來自於requests中,request是一個對象,並且是一個很是全面且強大的對象,咱們能夠經過這個對象點出來不少東西,好比:
request.MATE # mate所包含的是幾乎全部的HTTP的請求信息,以k:v鍵值對的形式存儲的 request.scheme # 請求的方式,可能性是兩種,即http和https request.path # 請求的路徑,這裏是低昂對路徑,若是要取絕對路徑是request.get_full_path() request.encoding # 獲取提交的數據的編碼方式 request.session # 獲取是一個session,實際上就是一個無序的字符串,用來做爲惟一識別嗎的,由於以前咱們說過http是一個無狀態的協議,須要另外的東西來確保用戶的狀態 request.cookies # 與session很是類似的一個東西,區別就在於session在服務端,cookies在客戶端 request.method # 獲取請求方式,GET或者POST request.body # 請求的主體,返回數據的格式是一個字符串 request.data # 請求的數據部分,和body類似,可是格式不一樣,data是一個字典對象 request.POST # 獲取POST請求所攜帶的數據,能夠直接當成一個列表套字典來取值,可是僅僅用request.POST.get()只能取到列表的最後一位,若是要取整個列表的話須要用request.POST.getlist()來取值 request.GET # 用法和POST幾乎同樣,就是獲取GET()請求所攜帶的數據
def reg(request): user_dict = {'name': 'jason', 'pwd': 123} # 給模板傳值的方式1 return render(request, 'reg.html', {'xxx': user_dict}) # 會將user_dict傳遞給reg.html頁面,頁面上經過xxx就能拿到該字典 # 給模板傳值的方式2 return render(request, 'reg.html', locals()) # 會將當前名稱空間中全部的變量名所有傳遞給頁面 # locals()會出現效率問題,變量名不少的話,會形成空間浪費,不過我的學習的話,其實直接用locals()沒什麼問題
咱們知道,數據庫就能夠當作是一個服務端,咱們能夠用Navicat來鏈接數據庫,也能夠直接用cmd窗口來操做數據庫,一樣的,咱們經過Django也能夠鏈接數據庫,以及對其進行操做
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 指定數據庫MySQL,postgreSQL 'NAME': 'db1', # 使用哪一個庫 'USER': 'root', # 數據庫帳號 'PASSWORD': 'root', # 數據庫密碼 'HOST': '127.0.0.1', # 數據庫的地址 'PORT': 3306, # 數據庫的端口 'CHARSET': 'utf8' # 數據庫的默認字符編碼 } }
而後,Django默認使用的數據庫是musqldb,然而如今這種工具幾乎已經絕版了,因此咱們須要告訴Django不要用mysqldb,而是用pymysql來鏈接數據庫,這裏常見的有兩種方法
__init__.py
裏寫入下面語句__init__.py
裏寫入下面的語句import pymysql pymysql.install_as_MySQLdb()
Django裏面的ORM能夠幫助咱們建立表,但不能直接建立數據庫,因此咱們要先手動建立數據庫,而後經過ORM來建立表.
首先咱們須要在app名下的models
裏面寫入須要添加進數據庫的表,包括各類字段,例程以下:
from django.db import models # Create your models here. class Userinfo(models.Model): # 設置id字段爲Userinfo表的主鍵,id int primary key auto_increment # django裏面能夠不指定主鍵字段,django的ORM會自動給當前表新建一個名爲id的主鍵字段 id = models.AutoField(primary_key=True) # 設置username字段, username varchar(64) CharField必需要指定max_lenth參數 # django 的ORM中,沒有char字段,可是django暴露給用戶能夠自定義char字段 username = models.CharField(max_length=64) # 設置password字段, password int password = models.IntegerField() phone = models.BigIntegerField(default=110) # 新增的字段能夠提早設置默認值,若是沒有提早設置,那麼必定要設置能夠爲null,不然不讓你添加字段 addr = models.CharField(max_length=64, null=True) # 該字段能夠爲空 class Book(models.Model): title = models.CharField(max_length=64)
在定義好上述類以後,咱們就能夠經過如下兩個語句來真正建立表
# 如下兩個語句是在cmd窗口,或者說是在Pycharm裏面的Terminal窗口裏輸入的,注意當前目錄,必定要在項目所在的位置 python manage.py makemigrations #不會建立表,僅僅是生成一個記錄,將你當前的操做記錄下來(migrations文件夾) python manage.py migrate #真正的將你的ORM語句遷移到數據庫中 # 尤爲要注意的是:只要在models.py中修改了跟數據庫相關的代碼,就必須從新開始執行上面兩個語句,注意,必須從新執行!!!
這裏介紹最簡單的兩種操做,即插入和查詢
models.Userinfo.objects.create(username='admin', password='123') # 上述語句實現的就是這個sql語句:insert into userinfo(username,password) values('admin','123'); # create方法會有一個返回值,返回值就是當前被建立的數據對象 # 這裏要注意的是,你要清楚的知道本身插入的表的字段的數量,以及格式,不然很容易報錯
# 1. get() 當查詢條件不存在的時候會直接報錯,若是存在會直接給你返回數據對象自己(不推薦使用) res = models.Userinfo.objects.get(username=username) # select * from userinfo where username = 'jason' print(res) print(res.username, res.password) # 2. filter() 查詢 # 當條件存在的狀況下,不管數據有幾條,返回的都是列表套對象的數據格式 # filter能夠放多個查詢條件,而且是and關係 # filter查詢出來的結果當作列表去對待,支持正數的索引取值和切片,不支持負數,因此不能用[-1] res = models.Userinfo.objects.filter(username=username, password=password) # user_obj = res[0] user_obj = res.first() # 取queryset第一個元素
def edit_user(request): edit_id = request.GET.get('edit_id')# 這裏咱們要獲取前端發過來的數據中的edit_id字段,同時也是主鍵字段,以此爲依據來取出來數據庫中的該條數據 if request.method == 'POST':#若是是POST發送數據,而不是GET取數據 # 將用戶新修改的全部數據 username = request.POST.get("username") password = request.POST.get("password") ''' POST請求中,也是能夠獲取GET請求攜帶的參數的''' # 去數據庫中修改對應的數據 # 方式一: models.Userinfo.objects.filter(pk=edit_id).update(username=username, password=password) # 批量更新,即update方法會將filter查詢出來的queryset對象中全部的數據對象所有更新 # 方式二:先獲取當前數據對象,而後利用對象點屬性的方式,先修改數據,而後調用對象方法保存 # 不推薦使用第二種方式,效率低,由於須要挨個從新寫入數據,而不是update那種只更新有變化的 # edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # edit_obj.username = username # edit_obj.password = password # edit_obj.save() # 跳轉到數據展現頁面 return redirect('/userlist') # 以edit_id爲依據來取出數據庫中的數據,取出的是一個對象 edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() return render(request, 'edit_user.html', locals())
def delete_user(request): # 獲取想要刪除的數據id 直接刪除 delete_id = request.GET.get('delete_id') models.Userinfo.objects.filter(pk=delete_id).delete() # 批量刪除,即filter匹配到的符合條件的數據都會刪除 return redirect('/userlist')