一、初始化django項目
1、安裝和啟動
1.1 安裝django
> pip inistall django==2.2.9 -i https://pypi.doubanio.com/simple
- 查詢Django安裝的版本
> python -m django --version
1.2 創建和啟動django
創建&啟動 方式一:
1. 開啟一個django項目
> django-admin startproject django1906
2. 使用PyCharm打開項目并創建虛擬環境
- 方式1: File -- Settings -- Project -- Project Interpreter -- Add
- 方式2: 在終端執行:python -m venv venv / virtualenv
3. 安裝項目所需依賴項
> pip install -r requirements.txt -i https://pypi.doubanio.com/simple
4. 運行項目
Add Configuration --> + --> Python
> python manage.py runserver
# --> Script Path (manage.py)
# --> Parameters (runserver)
創建&啟動 方式二:
1. 用PyCharm創建一個普通的Python項目
2. 安裝Django所需的依賴項
> pip install -r requirements.txt -i https://pypi.doubanio.com/simple
3. 把Python項目變成Django項目
> django-admin startproject django1906 .
4. 運行項目
> python manage.py runserver
~ Add Configuration --> + --> Python
創建&啟動 方式三:
1. 克隆項目到本地
~ 使用PyCharm的"get from version control"
~ git clone git@gitee.com:jackfrued/django1906.git
2. 創建虛擬環境
~ Linux/macOS: source venv/bin/activate
~ Windows: "venv/Scripts/activate"
3. 重建依賴項
> pip install -r requirements.txt -i https://pypi.doubanio.com/simple
4. 運行項目
> python manage.py runserver
~ Add Configuration --> + --> Python
1.3 生成項目依賴項文件:
- 追加項目所需依賴項到依賴項文件
pip freeze > requirements.txt
- 根據依賴項清單安裝項目所需依賴項
pip install -r requirements.txt
1.4 .gitignore忽略文件
去該網站生成 gitignore內容
https://gitignore.io/
2、初始化django項目配置
2.1 創建應用
方式1: python manage.py startapp 應用名字
方式2: django-admin startapp 應用名字
2.2 創建數據庫
- 創建數據庫
> create database django1906 default charset utf8 collate utf8_bin;
- 創建用戶
> create user 'jackfrued'@'%' identified by '123456';
- 給用戶授權
> grant all privileges on django1906.* to 'jackfrued'@'%';
2.3 配置數據庫到項目
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django1906',
'HOST': '120.77.222.217',
'PORT': 3306,
'USER': 'jackfrued',
'PASSWORD': '123456',
'CHARSET': 'utf8',
'TIME_ZONE': 'Asia/Chongqing',
}
}
2.4 在settings.py文件中將應用添加到 INSTALLED_APPS
INSTALLED_APPS = [
.....
'polls',
]
2.5 在項目主路徑新建templates目錄
image.png
2.5.1 在settings文件配置templates路徑
image.png
2.6 在項目主路徑新建static目錄
image.png
2.6.1 在settings文件配置static路徑
image.png
2.7 在settings文件配置時區
image.png
2.8 更新項目數據到數據庫
python manage.py makemigrations polls
python manage.py migrate
2.9 向數據庫添加數據:
insert into tb_subject values(default,'python+人工智能','python課程介紹'),(default,'JavaEE','JavaEE課程介紹'),(default,'HTML5+跨平臺','HTML5課程介紹');
2.10 為項目創建超級管理員賬號
python manage.py createsuperuser
用該賬戶可登陸后臺 http://127.0.0.1:8000/admin
二、項目優化
1、django調試工具:django_debug-toolbar
1.1 在終端安裝django_debug-toolbar:
pip install django_debug-toolbar
1.2 在settings添加配置
image.png
image.png
還需添加settings項:
DEBUG_TOOLBAR_CONFIG = {
# 引入jQuery庫
'JQUERY_URL': 'https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js',
# 工具欄是否折疊
'SHOW_COLLAPSED': True,
# 是否顯示工具欄
'SHOW_TOOLBAR_CALLBACK': lambda x: True,
}
1.3 urls.py中加入
if settings.DEBUG:
import debug_toolbar
urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
2、配置緩存
2.1 安裝 django-redis==4.11.0
2.2 在Settings中加入:
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': [
'redis://118.190.0.120:6379/0',
],
'KEY_PREFIX': 'djang1906',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS': {
'max_connections': 512,
},
'PASSWORD': 'yourpass',
}
},
}
# 配置使用緩存來支持用戶會話
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 會話數據放在哪一組緩存中
SESSION_CACHE_ALIAS = 'session'
3、配置日志:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/django/debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
其它:
REST架構
實體 -- 數據 -- 數據接口 -- 網絡API(HTTP/HTTPS)
https -- hypertext transfer protocol secure
REST架構 -- RESTful API -- 無狀態, 冪等性
(冪等性:其任意多次執行對資源本身所產生的影響均與一次執行的影響相同)
REpresentational State Transfer -- 表述性狀態轉移
最適合互聯網應用的架構
水平擴展 -- 單機結構 -- 多機結構(分布式集群)
HTTP -- 無連接無狀態協議
URL -- Uniform Resource Locator -- 資源
HTTP協議 請求行:GET/POST/DELETE/PUT/PATCH
新建 post -- 不需要冪等性
查看 get
更新 put / patch
刪除 delete
反向工程
1、數據庫中已建好表格
2、在應用目錄新建models.py文件
3、在終端輸入:python manage.py inspectdb > common/models.py
4、實現數據庫中表變模型
改變全局下載路徑:
- 在C:\Users\Administrator 目錄下創建pip文件夾
- 在pip文件夾中創建一個pip.ini文件
- 文件中寫入:
[global]
index-url=https://pypi.doubanio.com/simple - 保存搞定
生成哈希摘要:
~from hashlib import md5,sha1,sha256,sha512
~uuid1()hex
~hasher=md5()
~with open('Python-3.8.1.tar.xz','rb') as file:
data = file.read(4096)
while data:
hasher.update(data)
data=file.read(4096)
print(hasher.hexdigest())
用戶跟蹤
- 如果希望服務器要記住用戶 可以使用以下三種輔助方式:
1. URL重寫 [http://www.baidu.com/?uid=xxxx](http://www.baidu.com/?uid=xxxx)
2. 隱藏域(隱式表單域)
3. 瀏覽器本地存儲
1) cookie - 瀏覽器中的一個臨時文件可以保存鍵值對
cookie中的數據在發起http請求時會自動加載到請求頭中
2) windows.localStorage / window.sessionStorage
request.session --> 服務器內存中的一個對象
cookie --> 用戶瀏覽器臨時文件 --> cookie中保存了session的ID
利用ModelViewSet創建視圖集
- 增刪改查全套
class HouseTypeViewSet(ModelViewSet):
queryset = HouseType.objects.all()
serializer_class = HouseTypeSerializer
- 只能讀
class HouseTypeViewSet(ReadOnlyModelViewSet):
queryset = HouseType.objects.all()
serializer_class = HouseTypeSerializer
- 局部路勁配置
# 創建路由器
router = SimpleRouter()
# 注冊視圖集(這里路徑不能加/,路由器會自動加)
router.register('housetypes', HouseTypeViewSet)
# 最后把注冊好的路徑列表和原列表合并
urlpatterns += router.urls
- 創建全局分頁
setting中修改REST的配置
給REST_FRAMEWORK增加配置,添加分頁功能
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5,
}
如果不想被全局分頁影響修改視圖中的pagination_class
class HouseTypeViewSet(ModelViewSet):
queryset = HouseType.objects.all()
serializer_class = HouseTypeSerializer
# 修改默認不分頁就不被全局分頁所影響
pagination_class = None
給view視圖集增加緩存功能
1.在類繼承的多是多繼承一個CacheResponseMixin
class EstateView(CacheResponseMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
queryset = Estate.objects.all().defer('district', 'agents')
def get_serializer_class(self):
if self.request.method in ('POST', 'PUT', 'PATCH'):
return EstatePostSerializer
else:
return EstateSimpleSerializer
def get(self, request, *args, **kwargs):
if 'pk' in kwargs:
return RetrieveAPIView.get(self, request, *args, **kwargs)
else:
return ListAPIView.get(self, request, *args, **kwargs)
2.在setting中增加一個配置代碼
# 配置混入類,增加是視圖集緩存功能
REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 120,
'DEFAULT_USE_CACHE': 'default',
'DEFAULT_OBJECT_CACHE_KEY_FUNC': 'rest_framework_extensions.utils.default_object_cache_key_func',
'DEFAULT_LIST_CACHE_KEY_FUNC': 'rest_framework_extensions.utils.default_list_cache_key_func',
}
通過接口篩選數據
1、手寫代碼:
image.png
2、利用django-filter三方庫
1)先安裝:pip install django-filter
2)將django_filters添加到settings.py中的INSTALLED_APPS中
OrderingFilter -- 排序(可以不加)
filter_fields -- 通過什么篩選(后面跟元組形式)
ordering_fields -- 通過哪些字段排序
3)
class EstateView(CacheResponseMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
queryset = Estate.objects.all().defer('agents')
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_fields = ('district',)
ordering_fields = ('hot', 'estateid',)
通過字段范圍搜索
1、自定義一個類來作為篩選條件
import re
import django_filters
from django.db.models import Q
class EstateFilterSet(django_filters.FilterSet):
"""自定義FilterSet"""
minhot = django_filters.NumberFilter(field_name='hot', lookup_expr='gte')
maxhot = django_filters.NumberFilter(field_name='hot', lookup_expr='lte')
keyword = django_filters.CharFilter(method='filter_by_keyword')
@staticmethod
def filter_by_keyword(queryset, key, value):
queryset = queryset.filter(Q(name__contains=value) |
Q(intro__startswith=value))
return queryset
2、在視圖集類中加入
class EstateView(CacheResponseMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
queryset = Estate.objects.all().defer('agents')
# 篩選
filter_backends = (DjangoFilterBackend, OrderingFilter)
# filter_fields = ('district',)
# 通過自定義的篩選類來篩選
filterset_class = EstateFilterSet
# 排序
ordering_fields = ('hot', 'estateid',)
# 加上下面這句就不限流
# throttle_classes = ()
配置限流(全局作用)
# 在setting中的REST_FRAMWORK配置中加入
# 給REST_FRAMEWORK增加配置,添加分頁功能
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5,
# 限流配置包
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'anon': '5/min',
},
}