蘋果隱私負責人將在歐盟資料保護會議上發言,庫克一直反對 iPhone 側載 App
django小白必會三板斧
與瀏覽器打交道的檢視函式都應該有返回值 常見的就是下列三個
HttpResponse
主要用於返回字串型別的資料
render
主要用於返回html檔案 並且支援模板語法(django自己寫的)
redirect
主要用於重定向 括號內可以寫其他網站的全稱 也可以自己網站的字尾
補充:django自帶重啟功能,當識別到專案中程式碼有變化之後,隔段時間會自動重啟,但是有時候較慢。
每個試圖函式第一個引數都是request(HttpRequest),伺服器接收到http協議的請求後,會根據報文建立HttpRequest物件,檢視函式的第一個引數是HttpRequest物件。HttpRequest物件包含當前請求URL的一些資訊。
def index(request):
print(request) # <WSGIRequest: GET '/index'>
return HttpResponse('你們好呀')
登入功能
我們之所以可以在瀏覽器位址列中輸入不同的路由訪問到不同的資源
是因為我們在後端框架中提前開設了相應的訪問介面所以使用者才能訪問
言外之意就是我們沒有開設介面 那麼肯定訪問不到
1.開設介面返回登入介面
2.登入介面需要使用bootstrap並且還需要自己編寫css和js
靜態檔案
3.頁面需要獲取前端使用者資料並且傳遞給後端
form表單
action引數:控制資料的提交地址
method引數:控制請求的提交方式
4.訪問登入頁面
靜態檔案全部顯示資源不存在
因為我們並沒有開設靜態資源訪問的介面
5.開設靜態資源的訪問介面
理論上應該自己去路由層開設介面資源,但是由於靜態檔案資源使用頻率很高。
只要是一個web專案都肯定需要,所以django為了避免開發者繁瑣,提供了靜態資源的配置檔案,只需要填寫固定的配置即可開設資源介面。
settings.py
靜態檔案資源訪問介面固定配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
html頁面路徑
/static/mycss.css
6.配置檔案中的兩點疑惑
STATIC_URL = '/static/'
STATICFILES_DIRS = []
以該址為例:/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
/static/是介面字首 表示具備訪問靜態檔案資源的許可權
具備了許可權之後會拿著介面字首後面的檔案路徑去列表中每個資料夾中查詢
bootstrap-3.3.7-dist/css/bootstrap.min.css
找到一個就結束
比如 static和static1裡面都有a.txt 那麼只會拿到static中的
7.介面字首動態繫結
如果templates中有很多html檔案並且都需要引入靜態資源
如果把介面字首修改了,頁面無法載入資源,需要用介面字首動態繫結
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
靜態檔案
編寫完成後不會經常被修改的與html頁面相關的檔案
css檔案、js檔案、圖片檔案、第三方框架檔案(bootstrap)
上述檔案都可以稱之為是'靜態檔案'
在django中靜態檔案單獨開設一個資料夾儲存,預設叫static資料夾
在該資料夾內還可以根據功能的不同繼續劃分不同的檔案
css資料夾、js檔案、img資料夾、others資料夾
request物件方法
提交post請求 預設會報403
前期不需要過多考慮 直接去配置檔案中註釋一行即可
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
1.get請求和post請求都會觸發同一個檢視函式login的執行
如何針對不同的請求執行不同的程式碼
get請求返回一個登入頁面
post請求獲取使用者資料並校驗
2.獲取當前請求方式
request.method 返回的是純大寫的請求方法字串
由於get請求更加常見,post請求次之,所以還可以按照下列方式簡寫
if request.method == 'POST':
return HttpResponse('默默的奮鬥才是王道 有了成就才有發言權')
預設讓檢視函式處理get請求
return render(request, 'login.html')
3.獲取post請求提交的普通資料
request.POST 結果是一個QueryDict 可以看成字典處理
request.POST.get('username')
request.POST.getlist('hobby')
get方法會拿到值列表中最後一個元素 而不是整個列表
getlist方法會直接拿到整個值列表
4.如何獲取url後面攜帶的資料
request.GET 結果是一個QueryDict 可以看成字典處理
request.GET.get('info')
request.GET.getlist('cityList')
特徵與上述request.POST一致 使用場景也很多
https://www.lagou.com/wn/jobs?kd=python&isSchoolJob=1&city=上海&pn=1
pycharm連結MySQL
其實pycharm也可以充當很多資料庫軟體的客戶端
1.pycharm右上方側邊 database
2.pycharm左下方邊角 database
3.上述兩個地方都沒有 需要下載外掛 或者直接重灌一個正常的pycharm
settings
plugins
搜尋database下載apple即可
連結資料庫
1.選擇資料庫
2.首次連結需要下載驅動
download driver...
3.測試連結如果不通過 則需要換驅動重新下載使用
Driver:MySQL MySQL for 5.1
django連結MySQL
django預設自帶一個sqlite3資料庫 但是功能很少 僅用於本地測試
# 1.預設配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 2.修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'jp_05',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'jason123',
}
}
# 3.指定模組
在專案同名的資料夾內的__init__.py
或者應用名的資料夾內的__init__.py
新增一行固定的程式碼
import pymysql
pymysql.install_as_MySQLdb()
django orm簡介
ORM:物件關係對映
特點
能夠讓不會寫SQL的python程式設計師使用python語法就可以直接操作MySQL。
好處:提升了開發效率...
壞處:封裝了SQL語句,有時候可能效率不高,還需要人為編寫SQL調優。
概念
表 類
一行行資料 類產生的一個個物件
資料欄位 物件的一個個屬性
orm基本使用
如果需要使用ORM 需要去應用下的models.py中編寫程式碼
1.編寫類程式碼
class Users(models.Model):
uid = models.AutoField(primary_key=True) # 等價於uid int primary key auto_increment
name = models.CharField(max_length=32) # 等價於name varchar(32)
pwd = models.IntegerField() # 等價於pwd int
如果不設定主鍵,django會在和資料庫互動之前主動替我們設定好主鍵id
2.執行資料庫遷移命令
python3 manage.py makemigrations # 記錄操作,會在應用資料夾下的migrations資料夾中產生一個記錄響應命令的
python3 manage.py migrate # 將操作遷移到資料庫
首次執行遷移命令 django還會自動建立一些預設需要使用到的表
3.表名的特徵
Users app01_users
由於django支援多個應用 為了區分不同應用下可能會出現相同的表名
所以自動加上了應用的字首 因為同一個應用下不可能出現相同的表名(只要你是個正常的程式設計師都不會犯這樣的錯誤)
4.擴充套件
1.表的主鍵可以不寫 orm會自動幫你寫一個名為id的主鍵
2.每次修改了跟資料庫相關的python程式碼 都需要重新執行遷移命令
針對兩個遷移命令 可以採用pycharm提示功能編寫
tools
run manage.py task
資料操作
# 1.增
user_obj = models.Users.objects.create(name='jack', pwd='333')
print(user_obj)
print(user_obj.uid)
print(user_obj.name)
print(user_obj.pwd)
# 2.查
res = models.Users.objects.filter(name='jason')
print(res) # <QuerySet [<Users: Users object>]>
print(res[0]) # Users object
print(res[0].uid) # 1
print(res[0].name) # jason
print(res[0].pwd) # 123
# 3.改
models.Users.objects.filter(uid=1).update(name='jasonNB')
# 4.刪
models.Users.objects.filter(uid=3).delete()