程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django常見面試題總結(二)

編輯:Python

接上篇文章:https://blog.csdn.net//article/details/125813096?spm=1001.2014.3001.5501

二十一、selected_related與prefetch_related有什麼區別?(重要)

在Django中,所有的Queryset都是惰性的,意思是當創建一個查詢集的時候,並沒有跟數據庫發生任何交互。因此我們可以對查詢集進行級聯的filter等操作,只有在訪問Queryset的內容的時候,Django才會真正進行數據庫的訪問。而多頻率、復雜的數據庫查詢往往是性能問題最大的根源。
不過我們實際開發中,往往需要訪問到外鍵對象的其他屬性。如果按照默認的查詢方式去遍歷取值,那麼會造成多次的數據庫查詢,效率可想而知。

在查詢對象集合的時候,把指定的外鍵對象也一並完整查詢加載,避免後續的重復查詢。
1,select_related適用於外鍵和多對一的關系查詢;
2,prefetch_related適用於一對多或者多對多的查詢。

二十二、什麼是Cookie、如何獲取、設置Cookie

會話跟蹤技術,保留用戶
Cookie是由服務器創建,然後通過響應發送給客戶端的一個鍵值對。
具體一個浏覽器針對一個服務器存儲的key-value({ })

設置Cookie

response.set_cookie("is_login",True)

獲取

request.COOKIES.get("is_login")

二十三、什麼是session,與cookie的對比、設置、獲取、清空session

Session是服務器端技術,利用這個技術,服務器在運行時可以 為每一個用戶的浏覽器創建一個其獨享的session對象,由於 session為用戶浏覽器獨享,所以用戶在訪問服務器的web資源時 ,可以把各自的數據放在各自的session中,當用戶再去訪問該服務器中的其它web資源時,其它web資源再從用戶各自的session中 取出數據為用戶服務。

設置session

request.session['username']="kobe"
request.session.set_expiry(7*24*3600) # 設置session過期時間為一周後

獲取session

username=request.session.get('age','')

刪除session

request.session.flush()

二十四、簡述什麼是FBV和CBV

FBV(function base views)就是在視圖函面使用函數處理請求
CBV(class base views)就是在視圖裡面使用類處理請求

二十五、命令migrate 和makemigrations的差別

生成遷移文件

python manage.py makemigration 子應用名

執行遷移

python manage.py migrate

二十六、視圖函數中,接收的請求對象常用方法和屬性有哪些

request.get:查詢字符串參數
request.post:form表單參數
request.body:非表單數據
request.FILES:個類似於字典的對象,包含所有的上傳件
request.user:請求用戶
request.path:請求url
request.method:請求方式

二十七、Django的Model的繼承有幾種形式,分別是什麼

重點:描述抽象模型類

二十八、Django中想驗證表單提交是否格式正確需要用到Form中的哪個函數

serializer.is_valid()

二十九、查詢集的兩大特性?什麼是惰性執行(重要)

惰性執行、緩存。
使用同一個查詢集,第一次使用時會發生數據庫的查詢,然後Django會把結果緩存下來,再次使用這個查詢集時會使用緩存的數據,減少了數據庫的查詢次數
新建一個查詢集對象就可以實現

三十、查詢集返回的列表過濾器有哪些

all()
filter()
exclude()
order_by()

三十一、在Django中,服務端給客戶端響應信息有幾種方式?分別是什麼?

HttpResponse,
JsonResponse,
redirect

三十二、QueryDict和dict區別

在HttpRequest對象中, GET和POST屬性是django.http.QueryDict類的實例。
QueryDict類似字典的自定義類,用來處理單鍵對應多值的情況。
在 python 原始的字典中,當一個鍵出現多個值的時候會發生沖突,只保留最後一個值。而在 HTML 表單中,通常會發生一個鍵有多個值的情況,例如 (多選框)就是一個很常見情況。


三十三、如何給一個字段設置一個主鍵

primary_key

三十四、解釋blank和null

blank

設置為True時,字段可以為空。設置為False時,字段是必須填寫的。字符型字段CharField和TextField是用空字符串來存儲空值的。如果為True,字段允許為空,默認不允許。

null

設置為True時,django用Null來存儲空值。日期型、時間型和數字型字段不接受空字符串。所以設置IntegerField,DateTimeField型字段可以為空時,需要將blank,null均設為True。

三十五、如何在django urlpatterns注冊路由

router=routers.SimpleRouter()
router.register('project',視圖類)
urlpatterns=[
path('',include(router.urls))
]

三十六、Django中如何加載初始化數據

Django在創建對象時在掉用save()方法後,ORM框架會把對象的屬性轉換為寫入到數據庫中,實現對數據庫的初始化;通過操作對象,查詢數據庫,將查詢集返回給視圖函數,通過模板語言展現在前端頁面

三十七、創建Django工程、Django app、以及運行的命令

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 終端調試代碼

三十八、簡述 django rest framework框架的認證流程。(非常重要)

1 創建子應用

python manage.py startapp users

2 注冊子應用

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',
]

3 采用JWT TOKEN認證

a 下載django-restframework-jwt

pip install djangorestframework-jwt

b settings.py文件中指定使用jwt TOKEN認證類

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',
],
}

4 配置路由,可以進行用戶名和密碼進行認證

全局路由

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),
]

測試

5 重寫生成token的方法:將用戶名和用戶id一同輸出

a、在項目公共文件utils中,新建handle_jwt_response.py文件

def jwt_response_payload_handler(token,user=None,response=None):
return {
'user_id':user.id,
'username':user.username,
'token':token
}

b、還得在settings.py文件中指定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',
}

測試

三十九、django rest framework如何實現的用戶訪問頻率控制?(非常重要)

1 settings.py文件中全局配置,所有繼承APIView的類視圖都會生效

REST_FRAMEWORK = {
...
...
...
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day', # 匿名用戶
'user': '10/day'
}
}

2 局部配置(在指定的繼承APIVIew的類視圖中加入throttle_classes = [CustomAnonRateThrottle],該類視圖具備限流功能)

公共文件中新建throttle_class.py文件

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

3 測試:

四十、values()與values_list()有什麼區別?

values : 取字典的queryset
values_list : 取元組的queryset


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved