Linux筆記02: Linux環境_2.2 Linux系統安裝
阿新 • • 發佈:2022-12-03
靜態檔案配置
1.編寫一個登入功能
1.建立django專案並建立一個app
2.在urls.py新增一組對應關係
3.在app的views.py中編寫登入核心邏輯
4.利用三板斧與前端做互動
2.為什麼我們可以訪問一個網址看到一些資源?
(自己理解:是因為我們提前把這個資源寫好了,我們在使用django框架的時候是因為我們在urls檔案裡將要用到的資源都提前寫好了,才能夠訪問到,如果沒有寫的話就沒法訪問)
我們在訪問django框架資源的使用之所以可以拿到資料是因為提前在urls.py中開設了相應的資源介面,如果訪問不到資源那麼就是沒有開設相應的介面
3.靜態檔案資源
html頁面上使用的不經常修改的資源
1.第三方框架檔案
2.css檔案
所有的css檔案
3.js檔案
所有的js檔案
4.圖片檔案
所有的img檔案
爭對靜態檔案資源我們一般放在static資料夾內
這個資料夾就按這個名字來設定不要進行修改
如果這個資料夾內又出現了好多檔案,然後有好多js檔案好多css檔案,那麼在這種情況下也可以進行對他們再次建立不同的資料夾進行管理,同樣如果一個同樣字尾的資料夾裡又有許多不同功能的檔案,也可以繼續進行資料夾劃分管理
'合理精細化管理'
找不到我們所引入的bootstrap的css與js檔案
為什麼找不到?? 一定要注意: '我們在訪問django框架資源的使用之所以可以拿到資料是因為提前在urls.py中開設了相應的資源介面,如果訪問不到資源那麼就是沒有開設相應的介面' 細品這句話,我們並沒有開設響應的介面,相當於我們直接將網址輸入瀏覽器的輸入欄裡中,我們用了django框架,那麼在訪問一些資源得到資料的時候必須是我們提前設定好的,這些資料別人可以拿到這些資源
所以我們在配置了前端的靜態檔案以後還的配置相應的介面,提前配好,才能訪問得到資源
針對靜態檔案資源的訪問也需要提前開設相應的介面
在settings檔案下最底部,檔案本身自帶有提示,設定靜態檔案的介面
# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' # 靜態檔案資源配置(固定的) STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') # 在匯入這些檔案的時候,不需要跳級,只需要/static/... ]
倆個static有什麼不同?
# /static/bootstrap-3.4.1-dist/js/bootstrap.min.js 1
STATIC_URL = '/static/' # 2 叫做介面字首
# 靜態檔案資源配置(固定的)
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static') # 3
# 在匯入這些檔案的時候,不需要跳級,只需要/static/...
]
'''
1參照的是2,它們倆是一致的,一旦介面字首寫對以後,1後面是一個完整的路勁,然後就會拿著這個整個路勁去3裡面查詢有沒有對應的這個檔案,
1和2不是那個我們建立的資料夾static,它就是一個標識,就是(bootstrap-3.4.1-dist/js/bootstrap.min.js)的一個字首,1與2一致後,才會去識別到我們建立的那個static資料夾裡查詢是否存在這個檔案
'''
那麼為什麼STATICFILES_DIRS對應的是一個列表
列表,可以存放許多個數據
首先先看前倆個static是否一致,然後再拿著介面後面的檔案路勁去資源配置裡查詢,裡面存放著不同的資料夾,然後挨個進行比對查詢,如果沒有的話就會報404錯誤
一個極端的問題:動態解析解決
有好多Html檔案都需要用到bootstrap原始碼,然後突然想改介面字首,所有頁面就睡失效,那怎麼做呢?
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
請求方法
1.GET請求
向別人索要資料,也可以攜帶額外的資料,在url後面加?後面跟上攜帶的資料
url?xxx=yyy&zzz=ooo&aaa=bbb
攜帶資料的限制:
1.資料只能是一些無關緊要的非敏感資料
2.資料大小有限制 2kb-4kb左右
GET請求沒有請求體(HTTP資料格式)
2.POST請求
朝別人提交資料,也可以攜帶額外的資料,資料都是放在請求體中,並且資料大小沒有限制
3.form表單預設的資料提交方式是GET
method = 'post'
action 控制資料的提交地址
方式1:朝當前頁面所在的地址提交
方式2:寫字尾 /index/ 自動補全ip和port
方式3:寫全稱https://www.baidu.com
4.提交post請求前期需要去配置檔案中註釋一行程式碼
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
request物件方法
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def login(request):
'''該函式將來會通過不同的請求方式觸發 並且需要執行不同的業務邏輯程式碼'''
# print(request.method)
if request.method == 'GET':
# 1.返回給前端一個頁面,
return render(request, 'login.html')
elif request.method == 'POST':
print(request.POST) # <QueryDict: {'username': ['Jason'], 'password': ['123']}>
res = request.POST.get('username')
print(res, type(res)) # 如果一個列表中有多個數據的時候,返回的是最後一個數據 kerry <class 'str'>
# Jason <class 'str'>
'''
雖然看起來是一個列表,但是我們獲取到的是一個字串
[31/Aug/2022 18:50:51] "GET /login/ HTTP/1.1" 200 1152
[31/Aug/2022 18:51:05] "POST /login/ HTTP/1.1" 200 9
<QueryDict: {'username': ['Jason', 'tony', 'kerry'], 'password': ['123']}>
kerry <class 'str'>
如果一個列表中有多個數據的時候,返回的是最後一個數據
'''
res1 = request.POST.getlist('username') # 如果你想那那個鍵對應的所有的值,就可以使用另一個方法,getlist
print(request.GET) # 只要在網址後面加的資料,無論發什麼請求,都可以通過request.GET拿到這個資料
return HttpResponse('收到了')
'''
[31/Aug/2022 18:35:10] "GET /login/ HTTP/1.1" 200 966
<QueryDict: {'username': ['Jason'], 'password': ['123']}>
:知識點小插曲:
在寫表單的時候,我們會寫一個name的屬性,如果不寫的話就不會獲取到它的資料
[31/Aug/2022 18:35:19] "POST /login/ HTTP/1.1" 200 9
'''
request.method 獲取請求方式 結果是純大寫的字串
request.POST 獲取POST請求傳送來的普通資料(不包含檔案)
request.POST.get() 預設只獲取列表中最後一個數據值
request.POST.getlist() 獲取鍵對應的整個列表 無論有幾個資料值
request.GET 獲取url後面攜帶的非敏感資料
request.GET.get() 預設只獲取列表中最後一個數據值
request.GET.getlist() 獲取鍵對應的整個列表 無論有幾個資料值
pycharm連線MySQL
1.查詢pycharm提供的database按鈕
Files--->settings--->plugins,然後搜尋Database Tools and sql
2.首次連結資料庫需要下載對應的驅動
django連結MySQL
django預設使用的是sqlite3 但是這款資料庫一般只用於本地測試 功能較少
1.配置檔案中修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定資料庫軟體名稱
'NAME': 'day55', # 指定庫名
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
2.報錯處理
1.django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
在__init__.py中新增下面倆句話
import pymysql
pymysql.install_as_MySQLdb()
2.AttributeError: 'str' object has no attribute 'decode'
3.指定連結MySQL的模組
django1.11 版本需要在專案或者應用目錄下的__init__.py中編寫一行程式碼
import pymysql
pymysql.install_as_MySQLdb()
django2.2 以上版本需要使用mysqlclient模組,不需要在__init.py檔案中新增那倆句程式碼
django orm
ORM:物件關係對映
類 對映成 表
物件 對映成 記錄
物件點屬性 對映成 欄位對應的值
"""
ORM的存在可以讓不會MySQL的python程式設計師 使用python的語法簡單快捷的操作MySQL
"""
``
from django.db import models
# Create your models here.
class User(models.Model): # 類似於定義了表名
# 原生sql語句,id int primary key auto_increment
id = models.AutoField(primary_key=True) # 類似定義了主鍵
# 原生sql語句,name varchar(32)
name = models.CharField(max_length=32) # 定義了一個name欄位
# 原生sql語句,pwd int
pwd = models.IntegerField() # 類似於定義了一個pwd的整形欄位
2.資料庫遷移/同步命令
1.將models中有關資料庫的操作記錄下來(migrations資料夾)
python38 manage.py makemigrations
2.將操作真正影響到資料庫中
python38 manage.py migrate
'''當修改了models中與資料庫相關的程式碼 都必須執行上述的命令'''
ps:可以簡寫 也可以指定應用單獨遷移/同步
在終端輸入python38 manage.py makemigrations,會在在migrations資料夾中出現一個0001——initial.py檔案,裡面會記錄我們想要創價的模型
# Generated by Django 2.2.22 on 2022-08-31 12:23
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=32)),
('pwd', models.IntegerField()),
],
),
]
python38 manage.py migrate
django會嵌入很多的應用,一個應用就是一個具體的業務邏輯,可能會出現不同的應用應用相同的表名,不同的應用建立了相同的表名,那麼此時的orm直接將我們建立的模型名作為表明的話就會發生衝突,所以它自動加了一個字首
3.orm會自動新增一個id的主鍵
表的主鍵在orm中 可以不寫 orm會自動幫你新增一個id的主鍵,如果你需要主鍵的名稱不叫id 只能自己建立
orm語法
1.查
models.User.objects.filter() 結果可以看成是一個列表套資料物件
如何獲取物件 可以使用first()方法 如果沒有值會返回None 我們if判斷即可
2.增
models.User.objects.create()
3.改
models.User.objects.filter(id=1).update(name='jasonNB')
4.刪
models.User.objects.filter(id=4).delete()
from django.http import HttpResponse
from django.shortcuts import render
from app01 import models
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 刪除資料
# models.User.objects.filter(id=5).delete()
# 修改資料
# models.User.objects.filter(id=1).update(name='jasonNB')
# 增加資料
# models.User.objects.create(name=username,pwd=password)
# 查詢表資料
# select * from user where name='' and pwd=''
# user_obj = models.User.objects.filter(name=username, pwd=password).first()
# print(res) # <QuerySet [<User: User object (1)>]> 列表套資料物件
# user_obj = res[0]
# if user_obj:
# print(user_obj.id) # 1
# print(user_obj.name) # jason
# print(user_obj.pwd) # 123
# return HttpResponse('登入成功')
# return HttpResponse("使用者名稱或密碼錯誤")
return render(request, 'login.html')