第四天

GenericView方法實現(xiàn)商品列表頁和分頁功能

class GoodListView(mixins.ListModelMixin, generics.GenericAPIView):
class GoodsListView(generics.ListAPIView):
分頁setting中配置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}
# 取消setting中配置
class StandardResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    page_query_param = 'p'
    max_page_size = 100
view中加入
pagination_class = StandardResultsSetPagination  # 此參數(shù)及功能在GenericApiView中

viewset

1.重寫了 as_view方法,使注冊url更加簡單。
2.動態(tài)設(shè)置serializer時的action

綁定方法1
goods_list = GoodsListViewset.as_view({
    'get': 'list',
})
方法二(后期用法)
router.register('goods', GoodsListViewset)
path('', include(router.urls)),  # 此處為空字符串,切記

view之間的繼承關(guān)系,最后一個view屬于django
GenericViewSet
    GenericAPIView  配合mixin組合成了很多功能類
        APIView
            View
mixins和genericviewset增加view功能

drf的request和response

過濾

類中必須重載queryset,如果queryset為None就會報錯
django自帶的過濾
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    pagination_class = StandardResultsSetPagination  # 此參數(shù)及功能在GenericApiView中

    def get_queryset(self):
        price_min = self.request.query_params.get('price_min', 0)
        if price_min:
            self.queryset = self.queryset.filter(shop_price__gt=price_min)
        return self.queryset

drf過濾

django_filter
install_app
rest_framework配置 或者對特定的view設(shè)置

drf的過濾器簡單使用
from django_filters.rest_framework import DjangoFilterBackend

    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('name', 'shop_price')
較高級使用(新建filters文件)
class GoodsFilter(filters.FilterSet):
    min_price = filters.NumberFilter(field_name="shop_price", lookup_expr='gte')
    max_price = filters.NumberFilter(field_name="shop_price", lookup_expr='lte')

    class Meta:
        model = Goods
        fields = ['name', 'min_price', 'max_price']

view中:
    filter_class = GoodsFilter

搜索和排序

在上文新建的filters中簡單模糊搜索:關(guān)鍵詞lookup應該跟數(shù)據(jù)庫查詢關(guān)鍵字相關(guān),不確定
    name = filters.CharFilter(field_name="name", lookup_expr='icontains')

drf自帶的search_filter: 可以采用類似正則表達式的方法(排序類似)
    from rest_framework import filters

    filter_backends = (DjangoFilterBackend, filters.SearchFilter)
    search_fields = ('name', 'goods_brief', 'goods_desc')

The search behavior may be restricted by prepending various characters to the search_fields.

'^' Starts-with search.
'=' Exact matches.
'@' Full-text search. (Currently only supported Django's MySQL backend.)
'$' Regex search.

category層級結(jié)構(gòu)序列化

class CategorySerializer3(serializers.ModelSerializer):
    class Meta:
        model = GoodsCategory
        fields = '__all__'


class CategorySerializer2(serializers.ModelSerializer):
    sub_cat = CategorySerializer3(many=True)

    class Meta:
        model = GoodsCategory
        fields = '__all__'


class CategorySerializer(serializers.ModelSerializer):
    sub_cat = CategorySerializer2(many=True)

    class Meta:
        model = GoodsCategory
        fields = '__all__'

django跨域的問題 =>

pip install django-cors-headers
install_app -> corsheaders
midware -> 'corsheaders.middleware.CorsMiddleware', # 跨域問題
CORS_ORIGIN_ALLOW_ALL = True
https://github.com/ottoyiu/django-cors-headers
價格篩選過程中前后端的參數(shù)需要一致,否則會出錯。

用戶登錄和手機注冊

drf的token登錄和原理

前后端不分離的帶有csrf驗證,如果采用前后端分離不方便帶csrf_code方法
install_app中: 'rest_framework.authtoken' # token
makemageration->magerate->數(shù)據(jù)表遷移
url配置

from rest_framework.authtoken import views
    path('api-token-auth', views.obtain_auth_token),

chorme的servistate插件:用于測試url的返回數(shù)據(jù)等功能
此時POST http://127.0.0.1:8000/api-token-auth (用戶數(shù)據(jù))->就能返回token

采用token驗證

django默認采用session登錄機制?
寫入類似Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b的http header。
setting中的REST_FRAMEWORK加入tokenauth攔截器。(此方法用于測試,全局的,測試完要刪除。)
實際開發(fā)中將token攔截寫入類中,防止公共頁面的權(quán)限不夠。
middleware攔截機制,重載process_request&process_response
drf token的問題, 存儲在服務(wù)器,分布式服務(wù)器要多處存儲,沒設(shè)置過期時間。
viewset配置認證類

from rest_framework.authentication import TokenAuthentication
    authentication_classes = (TokenAuthentication, )  # 類內(nèi)配置用戶

JSON WEB TOKEN (一個規(guī)范)

好處:采用加密解密算法在服務(wù)器端運行驗證,無需再存入數(shù)據(jù)庫,增加速度,減少驗證時的服務(wù)器負載。
jwt介紹 7-4

使用jwt進行認證

pip install djangorestframework-jwt
setting中rest_framework配置:(實際開發(fā)時在類中加入,不在全局加入) 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',

from rest_framework_jwt.views import obtain_jwt_token
    # jwt的認證接口
    path('jwt-auth', obtain_jwt_token),

drf-jwt官方文檔,很重要。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容