自定義登錄功能
創建靜態文件夾(static文件夾)
views.py
中創建的視圖函數,會需要用到一些css樣式和js對象,如果還是通過CDN加速的方式,從網絡調用,會顯得不安全,當服務器網絡發生故障的時候,會導致css樣式和js對象加載不出來,因此我們需要將這些靜態文件放到本地存放。
靜態文件
css文件,js文件,圖片,字體,以及一些第三方的框架(bootstrap,sweetalert, fontawesome)
靜態文件夾(static)
解耦合,方便維護管理。
針對這些靜態文件,我們需要為其創建一個專門的文件夾,這樣可以顯得不是很雜亂,也可以統一進行管理,一般我們會命名為static
,結構如下:
static
- css 網站用到的所有css文件
- js 網站用到的所有js文件
- image 網站用到的所有圖片文件
第三方文件
django靜態文件配置
基本配置
在settings.py中修改:
STATIC_URL = '/static/' # 訪問后端靜態資源的接口前綴 默認情況下接口前綴名與靜態文件名保持一致
"""
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
你要想訪問后端的靜態資源 你必須以接口前綴開頭 后面跟上具體的文件路徑 才能夠訪問到對應的資源
當你的接口前綴正確之后 會拿着后面的路徑依次去下面列表中的每一個文件夾下查找對應的資源
順序是從上往下依次查找 如果都沒有找到才會報錯
"""
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 這里的static才是你文件夾的路徑
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
# 當static和static1中都有一個a.txt,當在static中查找到之后,就不會再去static1中查找了。
STATIC_URL:訪問后端靜態資源的接口前綴,默認情況下接口前綴與靜態文件名保持一致
它的作用類似一個令牌,當想要訪問靜態網頁資源,必須在這里寫上一個'/static/'
,當識別到link中的href路徑(<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap. min. css">
)或script的src路徑(<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
)以static開頭,django會允許你去STATICFILES_DIRS
列表中存在的所有文件夾下,查找所需要的資源。
當路徑的前綴改為XXX,那接口的前綴也需要改為XXX。
因此,這里的static對應的是以static開頭的路徑。
靜態資源動態綁定
前面的靜態資源接口,一旦發生改變,就需要去修改html中的導入css和js的前綴路徑,這樣會很麻煩,當html較多時,需要耗費大量的時間去修改,因此產生了一個動態綁定的方法:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
當靜態資源接口修改后,css和js的路徑也會隨之改變。
post請求需要修改配置文件
在提交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',
]
form表單回顧
form表單默認是以get請求提交數據,所提交的數據跟在url后面以?xxx=yyy&zzz=ttt
的形式存在。
http://127.0.0.1:8000/login/?username=admin&password=123
獲取請求方式(request.method
)
為了減少代碼的層級:一般情況下視圖函數處理get請求較多所以可以直接再函數體內先寫get請求對應的邏輯,將其他請求利用 request. method做出區分
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
return httpresponse('收到了')
return render(request,'login. html')
request對象方法
request.method
:獲取請求方式,返回GET/POST
request.POST
:獲取符合POST請求攜帶的數據,返回的是一個大字典。(<QueryDict: {'username': ['admin'], 'password': ['123']}>
)
-
request.Post.get('key')
:只會取列表最后一個元素 -
request.POST.getlist('key')
:取出整個列表
request.GET
:獲取符合get請求攜帶數據格式的數據(url?xxx=xxx&ooo=lll
)
request.GET.get('key')
: 只會取列表最后一個元素request.GET.getlist('key')
:取出整個列表
djangoMySQL連接★
1.先去配置文件(settings.py)中配置相關參數
# 修改數據庫的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫類別
'NAME': 'day49', # 庫的名字
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123',
'CHARSET': 'utf8'
}
}
2.在項目名或者應用名下面的__init__
文件中,指定使用pymysql替代mysqldb連接mysql
import pymysql
pymysql.install_as_MySQLdb()
django orm簡介
django orm不能做到創建庫,只可以創建表
# orm對象關系映射:
類 ------> 表
對象 ------> 記錄
屬性 ------> 字段值
orm可以使我們使用python面向對象的語法(句點符)來簡單快捷的操作數據
首先需要先去對應的應用下的models.py中書寫模型類(模型表)
# 示例:
class User(models.Model):
# int類型 primary key主鍵 auto_increment自增長
id = models.AutoField(primary_key=True)
# varchar(32)類型的字段,限制展示長度為32
name = models.CharField(max_length=32)
# int類型的字段
password = models.IntegerField()
# 其實創建的還是varchar類型
email = models.EmailField(default='123@qq.com')
# hobby字段可以為空
hobby = models.CharField(null=True,max_length=32)
之后需要執行數據庫遷移命令:
*************************數據庫遷移(同步)命令************************
python3 manage.py makemigrations # 僅僅是將你對數據庫的改動記錄到某個小本本上(migrations文件夾)
python3 manage.py migrate # 將改動真正的同步到數據庫中
***********只要你動了models.py跟數據庫相關的代碼 你就必須要重新執行上面的兩條命令來保證數據庫與models.py一致***********
字段的增刪改查
字段的增
直接在models.py文件中的模型表新增字段,再執行數據庫遷移命令即可
- 給該字段設置默認值
- models.EmailField(default='123456@com')
- 運行該字段可以為空
- models.EmailField(null=True)
字段的查
....
字段的改
直接修改models.py文件中的代碼后,執行數據庫遷移命令即可
字段的刪
只要注釋掉對應的字段,再執行數據庫遷移命令就會將對應的字段及數據信息全部刪除(慎用)
數據的增刪改查
查
1、查詢單條數據
from app01 import models # 先導入models模型表
models.類名.objects.filter(字段名='字段值')
res = models.User.objects.filter(username='jason') # select * from user where username='jason'
# 返回的結果是一個列表 支持索引取值但是不支持負數並且不推薦使用 推薦你使用它給你封裝好的方法
user_obj = res.first() # 取上面返回的列表中的第一個值
# filter方法條件不存在的時候 不會報錯返回的是一個空列表
"""
filter括號內直接放多個關鍵字參數 並且多個關鍵字參數之間是and關系
res = models.User.objects.filter(username='jason',password='123')
# 類似執行select * from user where username='jason' and password='123';
"""
2、查詢所有的數據
- filter() 括號內不寫拿所有
- all() 查詢所有數據
查詢數據,返回的是一個類似列表套字典的數據
<QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>, <User: 你不行>]>
增
1、create()
user_obj = models.User.objects.create(**kwargs)
user_obj = models.User.objects.create(name=username,password=password)
print(user_obj,user_obj.name)
# 該方法有返回值,返回值就是當前被創建的對象本身
2、對象的綁定方法
# 先生成一個User對象
user_obj = models.User(name=username, password=password)
# 調用對象的綁定方法
user_obj.save()
刪
models.User.objects.filter(id=delete_id).delete()
# 將filter過濾出來的數據全部刪除,類似批量刪除
改
1、方式一(推薦)
models.User.objects.filter(id=edit_id).update(name=username, password=password)
2、方式二(了解,不推薦)
通過對對象進行賦值和對象的綁定方法
# 先獲取數據對象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 再修改對象屬性
edit_obj.name = username
edit_obj.password = password
# 調用對象的綁定方法保存
edit_obj.save()
# 該方法會將所有的字段的數據重新修改,並不是針對某個字段進行修改,不推薦。