下面所有以登錄功能爲例來演示這些功能css
什麼是靜態文件?html
網站所使用的提早寫好的,後面不在進行修改的配置文件,例如前端
css文件;python
js文件;mysql
經常使用的第三方組件:sql
bootstrap數據庫
sweetalertdjango
fontawesomebootstrap
如何配置靜態文件後端
網站所用到的html文件統一放到templates文件夾中 那針對網站所使用到的靜態文件也應該單獨找一個文件夾來存儲 這個文件夾 默認狀況下都叫static 注意:該文件夾須要手動本身建立 而且該文件夾內部一般是如下結構 static -css 網站所用到的全部的css文件 -js 網站所用到的全部的js文件 -image 網站所用到的全部的圖片文件 第三方文件
這樣引入會發現沒法正常引用
補充:用戶在瀏覽器窗口之因此輸入網址可以拿到對應的資源 是由於後端開設相關的資源
那如何解決找不到資源的問題呢?
配置django靜態文件
django在配置文件中給你暴露了配置文件的配置信息 你只須要按照固定的寫法書寫便可暴露對應的靜態文件資源
第一步:找到位置
第二步:書寫配置代碼
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
如何解決動態綁定問題
什麼是接口前綴,通俗的說配置中的staic就是相似一個令牌,想訪問資源必須帶有staic接口前綴(能夠修改,可是必須與配置中的同樣),只有接口前綴(令牌)相同,纔會拿着後面的路徑依次去配置文件夾中的STATICEFILES_DIRS中的文件夾路徑下面列表中的每個文件夾下查找對應的資源,順序是從上往下依次查找 若是都沒有找到纔會報錯
加入已經寫好了一千個html頁面,每個頁面都用了static接口前綴,而後有個需求,配置中的static接口前綴須要修改,如何快速解決將那一千個頁面的接口前綴也修改了,這就須要用到接口前綴了
只須要添加下面幾句代碼,不論你接口前綴怎麼修改,都會保持一致
{% load static %} <!--加一行這個--> <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <!--在導入百分號和static便可動態綁定接口前綴--> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
<div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h2 class="text-center">登陸</h2> <form action="" method="post"> <p>username:<input type="text" name="username" class="form-control"></p> <p>password:<input type="text" name="password" class="form-control"></p> <input type="submit" class="btn btn-success "> </form> </div> </div> </div>
form表單 form表單默認是以get請求提交數據的(get請求會在url後面攜帶明文數據) http://127.0.0.1:8000/login/?username=admin&password=123 action 1.不寫 默認朝當前地址提交數據 2.全路徑 3.後綴(/index) 提交post請求的時候 須要先去配置文件中的中間件註釋掉一行,由於中間件相似於保安,會檢查請求和響應的數據是否安全(後面中間件有重點介紹) 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', ]
1).同一個視圖函數能夠處理不一樣的請求
eg: get請求來 應該只須要返回一個html文件 post請求來 應該獲取用戶提交的數據 而後作進一步處理 所以必需要可以判斷出當前請求究竟是什麼請求
request是一個對象,一個get請求就有下面這麼多的方法和屬性
2).method方法
總結:method能夠獲取前端的請求方法,而且是一個大寫的GET或POST字符串
一般狀況下針對不一樣的請求應該作不一樣的處理 而通常狀況下get請求次數要遠遠多於post請求
因此咱們應該針對非get請求做出邏輯判斷 將get請求直接寫在函數體內而不作判斷
def login(request): # 要給用戶返回一個登錄頁面 # print('我被觸發了') # 獲取前端請求方式 # if request.method == 'GET': # # get邏輯 # return render(request, 'login.html') # elif request.method == 'POST': # # post邏輯 # # print(request.method,type(request.method)) # GET <class 'str'> POST <class 'str'> # # 獲取數據 以後... # return HttpResponse('收到了你的數據 立刻處理') """ 爲了減小代碼的層級:通常狀況下視圖函數處理get請求較多 因此能夠直接再函數體內先寫get請求對應的邏輯 將其餘請求利用request.method作出區分 """ if request.method == 'POST': return HttpResponse('收到了') return render(request,'login.html')
3).request.POST
print(request.POST) # 獲取post請求攜帶的數據 <QueryDict: {'username': ['admin'], 'password': ['123']}> # 能夠把它當成是一個大字典 # 注意,總這些鍵是由前端傳的name屬性決定的 <p>username:<input type="text" name="username" class="form-control"></p> # 若沒有name屬性,即時在前端input框內提交了數據,也不會朝後端發送這個數據
所以:在input框中必定要有name屬性
4).如何獲取post裏面的數據(get和getlist)
# 例如:在前端頁面中有如下三個input框須要輸入數據傳入後端 <p>username:<input type="text" name="username" class="form-control"></p> <p>username:<input type="text" name="username" class="form-control"></p> # 而且有兩個相同的name屬性 <p>password:<input type="text" name="password" class="form-control"></p> # 可經過get的方式 print(request.POST) username = request.POST.get('usernamr') password = request.POST.get('password') print(username, type(usernsme)) print(password, type(password)) ''' <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}> jason <class 'str'> 123 <class 'str'> ''' #相同的name屬性獲得的是一個字典套集合的形式, # 經過結果咱們能夠發現數據都是字符串,若是數據是一個列表,那麼get獲取數據只能只是列表最後一個數據,不能所有獲取 username = request.POST.getlist('usernamr') # 經過getlist的方式能夠獲取整個列表
5)如何獲取GET請求的數據
GET請求和POST請求是同樣的,只不過GET請求獲取的是url後面攜帶的數據:url?xxx=xxx&yyy=yyy # 獲取符合get請求攜帶參數特色的數據 url?xxx=xxx&yyy=yyy print(request.GET) # <QueryDict: {'username': ['admin'], 'password': ['123']}> print(request.GET.get('username'),type(request.GET.get('username'))) # admin <class ’str‘> print(request.GET.getlist('password'),type(request.GET.getlist('password'))) # ['123'] <class 'list'> 只要符合這個url?xxx=xxx&yyy=yyy格式,request.GET都能獲取數據
先找到database
找到對應的數據庫
下載驅動嘗試連接數據庫
連接成功後就能找到數據庫表了
一些簡單操做(注意:pycharm因爲功能太多,因此不能作到面面俱到)
先去配置文件中配置相關參數
在settings中找到下面這個配置信息,進行修改
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 數據庫類別 'NAME': 'day49', # 庫的名字 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123', 'CHARSET': 'utf8' } }
下面的錯誤表示Djiango使用的是mysqldb這個模塊,這個版本是不兼容的,須要切換成pymysql模塊
在項目名或者應用名下面的__ init __.py文件中告訴django使用pymysql連接數據庫而不是用默認的mysqldb
import pymysql pymysql.install_as_MYSQLdb()
注意:django不能自動建立庫,須要本身手動建立,可是能夠自動建立表
orm對應關係以下
類名 |
表名 |
---|---|
屬性名 |
字段值 |
對象 |
記錄 |
做用:可以讓一個不會數據庫操做的小白也可以經過Python面向對象語法 句點符來簡單快捷的操做數據
首先須要先去對應的應用下的models.py中書寫你的模型類
class User(models.Model): # id int primary key auto_increment id = models.AutoField(primary_key=True) # name varchar(32) name = models.CharField(max_length=32) # password int password = models.IntegerField()
執行數據庫遷移命令(就是將models.py中創建的類同步到數據庫中)
1.python3 manage.py makemigrations # 僅僅是將你對數據庫的改動記錄到某個小本本上(migrations文件夾) 2.python3 manage.py migrate # 將改動真正的同步到數據庫中
執行第一步會產生下面的效果
執行第二步以後
補充知識點:
快捷命令輸入
若是主鍵名爲id,能夠不設置,django默認設置主鍵,若是設置了,以自定義的id爲主鍵
字段的增
能夠直接在models.py中進行字段的增,可是注意有兩種方式(由於數據庫中可能已經存入各類數據了,新添加一個字段,那些已經有數據的字段須要進行修改)
第一種是設置默認值,例如
email = models.EmailField(default='123@qq.com')
第二種是容許新設置的字段能夠爲空,例如(CharField須要設置max_length)
hobby = models.CharField(null=True,max_length=32)
字段的查改刪均可以經過直接操做models.py文件中的類屬性
惟一須要注意的就是凡是涉及到字段的操做都須要進行數據庫遷移命令,不然操做無效
查
第一步,在須要進行數據庫信息查詢的文件中導入models文件
from app01 import models
第二步,經過filter的方法能夠拿到所須要的數據列表
res = models.User.objects.filter(name=username) # 該方法返回的結果你能夠當作是一個列表套數據對象的形式,其中User表示表名,name表示字段名,後一個username是前端返回來的數據,即查詢條件 print(res) # <QuerySet [<User: User object>]>
第三步,該數據列表支持索引取值
user_obj = res[0] # QuerySet支持索引取值可是不支持負數 而且也不推薦直接索引取值 user_obj = res.first() # 索引和first()這兩種方法均可以 # print(user_obj.name,user_obj.password)
補充:當查詢條件不存在的時候,是一個queryset[]空列表,不會報錯
filter括號內直接放多個關鍵字參數 而且多個關鍵字參數之間是and關係 res = models.User.objects.filter(username='jason',password='123') # select * from user where username='jason' and password='123';
查全部數據
1.filter() 括號內不寫拿全部 <QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>]> 2.all() 查詢全部數據 <QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>]>
增
1.create() user_obj = models.User.objects.create(name=username,password=password) print(user_obj,user_obj.name) # 該方法有返回值 返回值就是當前被建立的對象自己 2.對象的綁定方法 # 1 先生成一個User對象 user_obj = models.User(name=username,password=password) # 2 調用對象的綁定方法 user_obj.save()
刪
# 簡單的刪除邏輯 # 用戶經過點擊刪除鍵就能刪除數據,須要獲取指定數據的id,經過這個id來操做數據的刪除 第一步:在前端刪除鍵上能夠綁定數據的id,這樣發送get請求就會帶上id <a href="/delete_user/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">刪除</a> 第二步:後端經過id來獲取數據 def del_user(request): # 如何獲取用戶想逃刪除的數據id delete_id = request.GET.get("delete_id") # 直接根據id刪除數據 models.User.objects.filter(id=delete_id).delete() # 將filter過濾出來的數據所有刪除 # 重定向到展現頁 return redirect('/home/')
改
改和刪前面基本一致 後面有兩種方法 def edit_user(request): # 獲取用戶想要修改的數據id值 edit_id = request.GET.get('edit_id') if request.method == 'POST': # 獲取用戶修改以後的用戶名和密碼 username = request.POST.get('username') password = request.POST.get('password') # 修改數據 # 方式1(推薦) # models.User.objects.filter(id=edit_id).update(name=username,password=password) # 方式2(瞭解) # 1 先獲取數據對象 edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改對象屬性 edit_obj.name = username edit_obj.password = password # 3 調用對象的綁定方法保存 edit_obj.save() # 再次跳轉到數據展現頁 return redirect('/home/') # 根據id獲取數據對象 而且展現到html頁面上 edit_obj = models.User.objects.filter(id=edit_id).first() return render(request,'edit_user.html',{'edit_obj':edit_obj})