靜態文件的配置settings.py文件末尾添加靜態文件路徑css
#靜態文件引用別名 STATIC_URL = '/static/' # 靜態文件存放位置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static1'), os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'static2'), ] HTML文件使用事例: <link rel="stylesheet" href="/static/css/login.css">
在靜態文件目錄下應該建立css,js,img等目錄,專門存放對應的靜態,若是應用就加上別名+靜態文件目錄+文件名
剛開始學習時可在配置文件中暫時禁用csrf中間件,方便表單提交測試html
# 中間件相關的配置 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', ]
urls.py文件中(不規範,應該寫在app的views.py文件中)前端
from django.shortcuts import HttpResponse,render,redirect def login(request): error_msg='' #須要判斷 if request.method == 'POST': #第二次來,表示填寫完了要給我發送數據了 --> POST u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) if u == '123@qq.com' and p == '1234': # 登錄成功則跳轉到baidu # return redirect('http://www.baidu.com') return redirect('/index/') else: # 登錄失敗 # 提示用戶名或密碼錯誤 # pass error_msg ='用戶名或密碼錯誤' # 第一次來,是跟我要一個登錄頁面用來填寫數據的 --> GET return render(request, 'login.html',{'error_msg': error_msg}) def test(request): #拿到用戶發送過來的數據 print(request.POST) # request.POST['user'] # u = request.POST.get('user') # p = request.POST.get('pwd') # print(u,p) # if u == '123@qq.com' and p =='1234': # #登錄成功 # # return redirect('http://www.baidu.com') # return redirect('/index/') # # else: # #登錄失敗 # #提示用戶名或密碼錯誤 # pass return HttpResponse('能夠') def index(request): return render(request, 'index.html') urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', login), url(r'^test/', test), url(r'^index/', index), ] form表單提交數據的三個要素 1.from標籤必需要有action和method屬性 2.全部獲取用戶輸入的標籤必須放在from表單中,必需要有name屬性 3.必需要有submit按鈕 from django.shortcuts import HttpResponse,render,redirect 1.HttpResponse 返回一個指定字符串時 2.render 返回一個HTML文件 3.redirect 跳轉 request相關的屬性 request.method --> 返回的是請求的方法(全大寫GET/POST) request.GET --> 取的是URL裏邊的參數,相似於字典的數據結構 request.POST --> post提交的數據
Django的MTV模式(下降各個部分之間的耦合性)python
Model(模型):負責業務對象與數據庫的對象(ORM)
Template(模版):負責如何把頁面展現給用戶
View(視圖):負責業務邏輯,並在適當的時候調用Model和Template
Django還有一個urls分發器,它的做用是將一個個URL的頁面請求分發給不一樣的view處理,view再調用相應的Model和Template
Django框架圖示mysql
APP(至關於文件夾)
一個Django項目能夠分爲不少個APP,用來隔離不一樣功能模塊的代碼
cmd項目根目錄命令行建立
python manage.py startapp app01
使用PyCharm建立ios
註冊(建立完APP必須註冊,不然不能用)sql
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #找到建立的app目錄中的apps.py文件裏的App01Config 'app01.apps.App01Config' ]
把urls.py文件中的函數及導入的模塊寫在views.py文件中(規範寫法)數據庫
urls.py from django.conf.urls import url from django.contrib import admin #把app中的views文件單過模塊導入到urls文件中 from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^test/', views.test), url(r'^index/', views.index), ] app中的views.py文件中寫函數 from django.shortcuts import HttpResponse,render,redirect
# Create your views here. def login(request): error_msg='' #須要判斷 if request.method == 'POST': #第二次來,表示填寫完了要給我發送數據了 --> POST u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) if u == '123@qq.com' and p == '1234': # 登錄成功 # return redirect('http://www.baidu.com') return redirect('/index/') else: # 登錄失敗 # 提示用戶名或密碼錯誤 # pass error_msg ='用戶名或密碼錯誤' # 第一次來,是跟我要一個登錄頁面用來填寫數據的 --> GET return render(request, 'login.html',{'error_msg': error_msg}) def test(request): #拿到用戶發送過來的數據 print(request.POST) # request.POST['user'] # u = request.POST.get('user') # p = request.POST.get('pwd') # print(u,p) # if u == '123@qq.com' and p =='1234': # #登錄成功 # # return redirect('http://www.baidu.com') # return redirect('/index/') # # else: # #登錄失敗 # #提示用戶名或密碼錯誤 # pass return HttpResponse('能夠') def index(request): return render(request, 'index.html')
ORMnpm
ORM DB
類 表
屬性 字段
對象 數據行
#ORM鏈接數據庫必須在app中的views.py文件中導入此模塊 from app01 import models 1. 建立一個mysql數據庫 2. 在settings中進行數據庫的配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎 'NAME': 'django_day53', # 名稱 'HOST': '127.0.0.1', # IP地址 'PORT': 3306, # 端口 'USER': 'root', # 用戶名 'PASSWORD': '123' # 密碼 } } 3. 告訴Django使用pymysql模塊鏈接mysql數據庫 在與settings同級目錄下的__init__中寫: import pymysql pymysql.install_as_MySQLdb() 4. 在app下的models.py中寫類(表): class User(models.Model): username = models.CharField(max_length=32) # varchar(32) password = models.CharField(max_length=32) 5. 在Terminal窗口執行數據庫遷移的命令: python manage.py makemigrations # 保存models.py的變動記錄 python manage.py migrate # 將變動記錄同步到數據庫中 6.ORM操做 在app中的views.py文件中 def orm_test(request): #方法一 # 全部數據 對象列表 ret = models.User.objects.all() for i in ret: print(i, type(i)) print(i.username, i.password) #方法二 # 獲取一個知足條件的對象 沒有數據 或者 多條數據就報錯 ret = models.User.objects.get(username='alex') #方法三 # 獲取知足條件的全部對象 ret = models.User.objects.filter(username='alex1', password='alexdsb') print(ret, type(ret))
pycharm鏈接mysql數據庫django
在views.py中定義函數orm_test,
def orm_test(request):
ret = models.User.objects.filter(user='bob', pwd='1234')
print(ret, type(ret))
return HttpResponse('ok')
而後再urls.py中定義url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^test/', views.test),
url(r'^index/', views.index),
url(r'^orm_test/', views.orm_test),
而後啓動django項目訪問/orm_test/便可看到django打印的日誌
修改views.py文件,讓其驗證數據庫中的用戶密碼
from django.shortcuts import HttpResponse,render,redirect #導入鏈接數據庫的模塊 from app01 import models # Create your views here. def login(request): error_msg='' #須要判斷 if request.method == 'POST': #第二次來,表示填寫完了要給我發送數據了 --> POST u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) # if u == '123@qq.com' and p == '1234': #判斷數據庫中查詢的用戶名密碼與前端用戶提交的用戶名密碼是否一致 if models.User.objects.filter(user=u,pwd=p): # 登錄成功 # return redirect('http://www.baidu.com') return redirect('/index/') else: # 登錄失敗 # 提示用戶名或密碼錯誤 # pass error_msg ='用戶名或密碼錯誤' # 第一次來,是跟我要一個登錄頁面用來填寫數據的 --> GET return render(request, 'login.html',{'error_msg': error_msg}) def test(request): #拿到用戶發送過來的數據 print(request.POST) # request.POST['user'] # u = request.POST.get('user') # p = request.POST.get('pwd') # print(u,p) # if u == '123@qq.com' and p =='1234': # #登錄成功 # # return redirect('http://www.baidu.com') # return redirect('/index/') # # else: # #登錄失敗 # #提示用戶名或密碼錯誤 # pass return HttpResponse('能夠') def index(request): return render(request, 'index.html') def orm_test(request): ret = models.User.objects.filter(user='bob', pwd='1234') print(ret, type(ret)) return HttpResponse('ok') 啓動django訪問/ligon/
一個django鏈接數據庫驗證用戶名密碼的案例
1.用pycharm建立項目pyproject 2.在cmd中建立app python manage.py startapp app01 3.在cmd中建立數據庫pymysql 4.把登錄頁面和登錄後的頁面放到django項目中templates文件夾中 登錄頁面login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>後臺管理系統</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <div class="container"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">登錄頁面<span class="glyphicon glyphicon-pushpin col-md-offset-11" aria-hidden="true"></span></h3> </div> <div class="panel-body"> {# action當提交表單時,表單數據會提交到名爲/login/的頁面,提交模式爲post#} <form class="form-horizontal" action="/login/" method="post"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">用戶名</label> <div class="col-sm-10"> {#name屬性用於對提交到服務器後的表單數據進行標識,只有設置了name屬性的表單元素才能在提交表單時傳遞它們的值#} <input type="text" name='user' class="form-control" id="inputEmail3" placeholder="User"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">密碼</label> <div class="col-sm-10"> <input type="password" name='pwd' class="form-control" id="inputPassword3" placeholder="Password"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox"> Remember me </label> </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> {# submit提交按鈕#} <button type="submit" class="btn btn-default">Sign in</button> <P style="color: red;text-align: center">{{ error_msg }}</P> </div> </div> </form> </div> </div> </div> </body> </html> 登錄成功後顯示的頁面index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <div class="container"> <h2>信息收集卡</h2> <div class="progress"> <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" style="width: 30%;"> 1/3 </div> </div> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">基本信息<span class="glyphicon glyphicon-pushpin col-md-offset-11" aria-hidden="true"></span></h3> </div> <div class="panel-body"> <form class="form-horizontal"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">姓名</label> <div class="col-sm-10"> <input type="email" class="form-control" id="inputEmail3" placeholder="姓名"> </div> </div> <div class="form-group"> <label for="inputPassword4" class="col-sm-2 control-label">手機</label> <div class="col-sm-10"> <input type="text" class="form-control" id="inputPassword4" placeholder="手機"> </div> </div> <div class="form-group"> <label for="inputPassword5" class="col-sm-2 control-label">郵箱</label> <div class="col-sm-10"> <input type="text" class="form-control" id="inputPassword5" placeholder="郵箱"> </div> </div> <div class="form-group"> <label for="inputPassword6" class="col-sm-2 control-label">密碼</label> <div class="col-sm-10"> <input type="password" class="form-control" id="inputPassword6" placeholder="密碼"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">頭像</label> <div class="col-sm-10"> <input type="file" id="exampleInputFile"> <p class="help-block">只支持png/jpg/gif格式.</p> </div> <div class="form-group"> <label for="inputPassword6" class="col-sm-2 control-label">屬性</label> <div class="col-sm-10"> <div class="radio"> <label> <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1"> 我是一個好人 </label> </div> <div class="radio"> <label> <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2"> 我是一個壞人 </label> </div> <div class="radio" disabled> <label> <input type="radio" name="optionsRadios" id="optionsRadios3" value="option3" disabled> 我是一個真人 </label> </div> </div> </div> </div> </form> </div> </div> <p class="text-right"> <button type="button" class="btn btn-success">下一步</button> </p> </div> </body> </html> 5.django修改中的文件 settings.py文件 # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #註冊app 'app01.apps.App01Config' ] # 中間件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 剛開始學習時可在配置文件中暫時禁用csrf中間件,方便表單提交測試 # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'pyproject.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , '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 = 'pyproject.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases #鏈接數據庫的配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'pymysql', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123.com' } } 修改urls.py文件 from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index), url(r'^orm/', views.orm_test), ] 修改__init__.py #導入pymysql模塊讓django鏈接mysql import pymysql pymysql.install_as_MySQLdb() 修改models.py from django.db import models # Create your models here. #使用orm建立數據庫userinfo表及設置表結構 class Userinfo(models.Model): user = models.CharField(max_length=32) pwd = models.CharField(max_length=32) 修改views.py from django.shortcuts import HttpResponse,render,redirect from app01 import models def login(request): error_msg='' if request.method == 'POST': u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) #獲取指定數據庫表的數據 if models.Userinfo.objects.filter(user=u,pwd=p): return redirect('/index/') else: error_msg ='用戶名或密碼錯誤' return render(request, 'login.html',{'error_msg': error_msg}) def index(request): return render(request, 'index.html') def orm_test(request): ret = models.Userinfo.objects.filter(user='bob', pwd='1234') print(ret, type(ret)) return HttpResponse('ok') 6.在pycharm的Terminal中執行 #保存models.py的變動記錄 python manage.py makemigrations #將變動記錄同步到數據庫中 python manage.py migrate 7.在pycharm中鏈接mysql數據庫,並插入測試的用戶名密碼數據 8.啓動django,頁面訪問 127.0.0.1:8000/login/ 127.0.0.1:8000/orm/