在Django中,所有的Queryset都是惰性的,意思是當創建一個查詢集的時候,並沒有跟數據庫發生任何交互。因此我們可以對查詢集進行級聯的filter等操作,只有在訪問Queryset的內容的時候,Django才會真正進行數據庫的訪問。而多頻率、復雜的數據庫查詢往往是性能問題最大的根源。
不過我們實際開發中,往往需要訪問到外鍵對象的其他屬性。如果按照默認的查詢方式去遍歷取值,那麼會造成多次的數據庫查詢,效率可想而知。
在查詢對象集合的時候,把指定的外鍵對象也一並完整查詢加載,避免後續的重復查詢。
1,select_related
適用於外鍵和多對一的關系查詢;
2,prefetch_related
適用於一對多或者多對多的查詢。
會話跟蹤技術,保留用戶
Cookie是由服務器創建,然後通過響應發送給客戶端的一個鍵值對。
具體一個浏覽器針對一個服務器存儲的key-value({ })
response.set_cookie("is_login",True)
request.COOKIES.get("is_login")
Session是服務器端技術,利用這個技術,服務器在運行時可以 為每一個用戶的浏覽器創建一個其獨享的session對象,由於 session為用戶浏覽器獨享,所以用戶在訪問服務器的web資源時 ,可以把各自的數據放在各自的session中,當用戶再去訪問該服務器中的其它web資源時,其它web資源再從用戶各自的session中 取出數據為用戶服務。
request.session['username']="kobe"
request.session.set_expiry(7*24*3600) # 設置session過期時間為一周後
username=request.session.get('age','')
request.session.flush()
FBV(function base views)就是在視圖函面使用函數處理請求
CBV(class base views)就是在視圖裡面使用類處理請求
python manage.py makemigration 子應用名
python manage.py migrate
request.get:查詢字符串參數
request.post:form表單參數
request.body:非表單數據
request.FILES:個類似於字典的對象,包含所有的上傳件
request.user:請求用戶
request.path:請求url
request.method:請求方式
重點:描述抽象模型類
serializer.is_valid()
惰性執行、緩存。
使用同一個查詢集,第一次使用時會發生數據庫的查詢,然後Django會把結果緩存下來,再次使用這個查詢集時會使用緩存的數據,減少了數據庫的查詢次數
新建一個查詢集對象就可以實現
all()
filter()
exclude()
order_by()
HttpResponse,
JsonResponse,
redirect
在HttpRequest對象中, GET和POST屬性是django.http.QueryDict類的實例。
QueryDict類似字典的自定義類,用來處理單鍵對應多值的情況。
在 python 原始的字典中,當一個鍵出現多個值的時候會發生沖突,只保留最後一個值。而在 HTML 表單中,通常會發生一個鍵有多個值的情況,例如 (多選框)就是一個很常見情況。
primary_key
設置為True時,字段可以為空。設置為False時,字段是必須填寫的。字符型字段CharField和TextField是用空字符串來存儲空值的。如果為True,字段允許為空,默認不允許。
設置為True時,django用Null來存儲空值。日期型、時間型和數字型字段不接受空字符串。所以設置IntegerField,DateTimeField型字段可以為空時,需要將blank,null均設為True。
router=routers.SimpleRouter()
router.register('project',視圖類)
urlpatterns=[
path('',include(router.urls))
]
Django在創建對象時在掉用save()方法後,ORM框架會把對象的屬性轉換為寫入到數據庫中,實現對數據庫的初始化;通過操作對象,查詢數據庫,將查詢集返回給視圖函數,通過模板語言展現在前端頁面
django-admin startproject django_project 創建一個項目
python manage.py runserver 運行項目
python manage.py startapp 子應用名 創建子應用
python manage.py makemigrations 子應用名 創建遷移腳本
python manage.py migrate 生成遷移腳本
python manage,py createsuperuser 創建管理員用戶
python manage.py shell 終端調試代碼
python manage.py startapp users
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders', # 同源策略
'rest_framework',
'drf_yasg', # 生成接口文檔子應用
'django_filters', # DRF過濾器子應用
'users',
]
pip install djangorestframework-jwt
REST_FRAMEWORK = {
# 指定搜索引擎類
'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter', ],
# 'DEFAULT_FILTER_BACKENDS':['django_filters.rest_framework.DjangoFilterBackend'],
# 'SEARCH_PARAM': 'se',
# 指定分頁引擎類
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 3,
# 指定用於支持coreapi的Schema
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
# 指定使用的認證類
# a、在全局指定默認的認證類(認證方式)
'DEFAULT_AUTHENTICATION_CLASSES': [
# 1、指定jwt token認證
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
}
urlpatterns = [
path('admin/', admin.site.urls),
re_path('',include('projects.urls')),
path('docs/',include_docs_urls(title='接口測試平台API文檔',description='這個是接口平台的文檔')),
re_path(r'^swagger(?P<format>.json|.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'), # <-- 這裡
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), # <-- 這裡
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), # <-- 這裡
path('user/',include('users.urls'))
]
urlpatterns=[
path('',include(router.urls)),
re_path(r'^(?P<username>w{6,20})/count/$', views.UsernameIsExistedView.as_view()),
re_path(r'^(?P<email>[A-Za-z0-9一-龥][email protected][a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+)/count/$',
views.EmailIsExistedView.as_view()),
path('login/', obtain_jwt_token),
]
def jwt_response_payload_handler(token,user=None,response=None):
return {
'user_id':user.id,
'username':user.username,
'token':token
}
# JWT配置
JWT_AUTH = {
# 指定token失效時間為1天
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
# 使用自己的jwt_response_payload_handler,目的是響應結果中可以返回用戶名和id
'JWT_RESPONSE_PAYLOAD_HANDLER': 'utils.handle_jwt_response.jwt_response_payload_handler',
}
REST_FRAMEWORK = {
...
...
...
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day', # 匿名用戶
'user': '10/day'
}
}
utils----->throttle_class.py,定義CustomAnonRateThrottle(隨意),但是必須繼承UserRateThrottle
UserRateThrottle:表示正對登錄用戶的
from rest_framework.throttling import UserRateThrottle
class CustomAnonRateThrottle(UserRateThrottle):
THROTTLE_RATES = {"user": "5/day"}
from utils.throttle_class import CustomAnonRateThrottle
class ProjectsViewSet(viewsets.ModelViewSet):
queryset=Projects.objects.all()
serializer_class = ProjectsSerializer
pagination_class = PageNumberPagination
permission_classes = [permissions.IsAuthenticated]
throttle_classes = [CustomAnonRateThrottle]
def list(self, request, *args, **kwargs):
response=super().list(request, *args, **kwargs)
for item in response.data['results']:
item['interfaces']=Interfaces.objects.filter(project_id__exact=item['id']).count()
item['testsuits']=Testsuits.objects.filter(project_id__exact=item['id']).count()
item['testcases']=Testcases.objects.filter(interface__project_id__exact=item['id']).count()
item['configures']=Configures.objects.filter(interface__project_id__exact=item['id']).count()
return response
values : 取字典的queryset
values_list : 取元組的queryset
先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦