主頁 > 後端開發 > django框架之drf(部分講解)

django框架之drf(部分講解)

2023-02-08 07:06:57 後端開發

目錄
  • 一、認證組件
      • (1)、登錄介面
      • (2)、認證組件使用步驟
      • (3)、整體代碼
  • 權限組件
      • (1)、權限組件的使用步驟
      • (2)、代碼用法
  • 三、頻率組件
      • (1)、頻率組件的使用步驟
      • (2)、代碼用法
  • 四、過濾的多種用法
      • (1)、繼承APIView自己寫
      • (2)、使用drf的內置過濾(繼承GenericAPIview)
      • (3)、使用第三方插件過濾(精準過濾)
      • 4、使用過濾組件
  • 五、排序的使用
      • (2)、代碼用法
  • 六、分頁

一、認證組件

簡介:

  • 登錄認證的限制

  • 認證組件是drf框架給我們提供的認證介面,它能夠在請求進入視圖函式/類前進驗證(例如:認證用戶是否登錄),對不符合認證的請求進行攔截并回傳校驗失敗的資訊

(1)、登錄介面

# 認證是基于登錄的介面上面操作的 所以前戲撰寫一個簡單的登錄介面

models.py
class User(models.Model):  # 簡易的用戶資訊賬號密碼
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

    def __str__(self):
        return self.username

	'跟User表是一對一外鍵關聯,存盤用戶登錄狀態用的 [這個表可以沒有,如果沒有,把欄位直接寫在User表上也可以]'
class UserToken(models.Model):  # 用戶資訊登錄記錄表
    user = models.OneToOneField(to='User', on_delete=models.CASCADE)  # 一對一關聯
    token = models.CharField(max_length=32, null=True)  # 如果用戶沒有登錄則沒有值 如果登錄則有值

views.py
	'登錄介面功能:自動生成路由+登錄功能,不用序列化,因此繼承ViewSet即可'
class UserView(ViewSet):
    @action(methods=['POST'], detail=False, url_path='login', url_name='login')
    def login(self, request):
        username = request.data.get('username')     # 獲取用戶名與密碼
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()    # 比對用戶名與密碼
        if user:
            token = str(uuid.uuid4())  
            # uuid4 隨機獲得永不重復的字串 機制跟Cookie中的驗證碼一樣
            # 在userToken表中存盤一下:1 從來沒有登錄過,插入一條,     2 登錄過,修改記錄
            
            
            UserToken.objects.update_or_create(defaults={'token': token}, user=user) 
            # 通過user去UserToken表中查資料,如果能查到,使用defaults的資料更新,如果查不到,直接通過user和defaults的資料新增
            # kwargs 傳入的東西查找,能找到,使用defaults的更新,否則新增一條
            return Response({'code': 100, 'msg': '登錄成功', 'token': token})
        else:
            return Response({'code': 101, 'msg': '用戶名或密碼錯誤'})

urls.py
	from rest_framework.routers import SimpleRouter, DefaultRouter
	router = SimpleRouter()
	router.register('users', views.UserView, 'users')
	urlpatterns += router.urls

'''這個時候一個簡單的登錄介面就寫好了 每次登錄都會更新Token 相當于登錄了之前的設備就無效了 '''

image
update_or_create原始碼如下:

    def update_or_create(self, defaults=None, **kwargs):
        defaults = defaults or {}
        self._for_write = True
        with transaction.atomic(using=self.db):
            try:
                obj = self.select_for_update().get(**kwargs)
            except self.model.DoesNotExist:
                params = self._extract_model_params(defaults, **kwargs)
                obj, created = self._create_object_from_params(kwargs, params, lock=True)
                if created:
                    return obj, created
            for k, v in defaults.items():
                setattr(obj, k, v() if callable(v) else v)
            obj.save(using=self.db)
        return obj, False

(2)、認證組件使用步驟

1.需要寫一個認證類,因此我們需要在應用中另外創建一個py檔案撰寫認證類,需要繼承BaseAuthentication這個類

  • 通過查看原始碼我們可以發現有個authenticate方法需要我們重寫,否則就會報錯,這就是我們需要撰寫認證功能的類
class BaseAuthentication:
    def authenticate(self, request):
        raise NotImplementedError(".authenticate() must be overridden.")

    def authenticate_header(self, request):
        pass

2.重寫authenticate方法,在該方法在中實作登錄認證

  • token在哪帶的?如何認證它是登錄了的?

  • token來判斷是否登陸,登陸了在訪問的時候帶上token,目前階段我們直接在地址欄中攜帶token的資料,后面可以在請求頭中添加token的資料

3、如果認證成功,回傳兩個值【回傳None或兩個值(固定的:當前登錄用戶,token)】

4、認證不通過,用AuthenticationFailed類拋例外

代碼如下:
authenticate.py(認證類)

# 自己寫的認證類,繼承某個類

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from .models import UserToken


class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        # 在這里實作認證,如果是登錄的,繼續往后走回傳兩個值,如果不是拋例外
        # 請求中是否攜帶token,判斷是否登錄,放在地址欄中
        token = request.query_params.get('token', None) # 查找是否有token這個變數名的值,如果沒有就回傳None,默認好像回傳的是數字
        if token:  # 前端傳入token了,去表中查,如果能查到,登錄了,回傳兩個值[固定的:當前登錄用戶,token]
            user_token = UserToken.objects.filter(token=token).first()
            if user_token:
                return user_token.user, token
            else:
                # 沒有登錄拋例外
                raise AuthenticationFailed('token認證失敗')
        else:
            raise AuthenticationFailed('token沒傳')

# 前端傳入的請求頭中的資料從哪取?  GET,body,POST,data

5、認證類的使用

  • 當我們撰寫好了認證類中的認證代碼,接著就需要匯入到視圖層然后使用他
from rest_framework.generics import ListAPIView, RetrieveAPIView
from rest_framework.viewsets import ViewSetMixin
from .authenticate import LoginAuth

# 查詢所有
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


    
    
class BookDetailView(ViewSetMixin, RetrieveAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    authentication_classes = [LoginAuth]  # 需要寫一個認證類,需要咱們自行撰寫

6、區域使用和全域使用

  • 區域使用:只在某個視圖類中使用【當前視圖類管理的所有介面】
class BookDetailView(ViewSetMixin, RetrieveAPIView):
	authentication_classes = [LoginAuth]
  • 全域使用:在組態檔settings.py中撰寫,全域所有介面都生效
REST_FRAMEWORK = {
    	'DEFAULT_AUTHENTICATION_CLASSES':['app01.authenticate.LoginAuth']
	}

注意事項:不要在組態檔中亂匯入不使用的東西,否則會報錯,但是在匯入類似認證類這樣的檔案時,可以寫上匯入的代碼然后再修改,最后寫進配置中,這樣可以減少錯誤

  • 區域禁用:(登陸介面很明顯是不需要校驗是否登陸的,因此有了這個區域禁用的需求,我們把他的authentication_classes配置成空就是區域禁用)
class BookDetailView(ViewSetMixin, RetrieveAPIView):
	authentication_classes = []

7、測驗路由參考

image

(3)、整體代碼

views.py

# 查詢所有
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


# 查詢單個
class BookDetailView(ViewSetMixin, RetrieveAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    authentication_classes = [LoginAuth]  # 需要寫一個認證類,需要咱們自行撰寫

authenticate.py(認證類)

# 自己寫的認證類,繼承某個類

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from .models import UserToken


class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        # 在這里實作認證,如果是登錄的,繼續往后走回傳兩個值,如果不是拋例外
        # 請求中是否攜帶token,判斷是否登錄,放在地址欄中
        token = request.query_params.get('token', None) # 查找是否有token這個變數名的值,如果沒有就回傳None,默認好像回傳的是數字
        if token:  # 前端傳入token了,去表中查,如果能查到,登錄了,回傳兩個值[固定的:當前登錄用戶,token]
            user_token = UserToken.objects.filter(token=token).first()
            if user_token:
                return user_token.user, token
            else:
                # 沒有登錄拋例外
                raise AuthenticationFailed('token認證失敗')
        else:
            raise AuthenticationFailed('token沒傳')

# 前端傳入的請求頭中的資料從哪取?  GET,body,POST,data

urls.py

from django.contrib import admin
from django.urls import path, include
from app01 import views
from rest_framework.routers import SimpleRouter

router = SimpleRouter()  # 后面這個少的用的多,
router.register('user', views.UserView, 'user')
router.register('books', views.BookView, 'books')
router.register('books', views.BookDetailView, 'books')

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include(router.urls)),

]

權限組件

簡介:

  • 在我們使用的一些app或者網頁中(愛奇藝,騰訊視頻),都會有一些會員介面(需要購買會員才能夠使用或者觀看),權限組件就是對用戶的這一權限進行驗證,在請求進入視圖類/函式代碼前進行校驗,校驗失敗后直接將請求攔截,并回傳校驗失敗的資訊

(1)、權限組件的使用步驟

模塊地址:

from rest_framework.permissions import BasePermission

用法簡介:

# 1、創建一個專門用于撰寫權限組件的py檔案,寫一個權限類,繼承BasePermission
# 2、重寫has_permission方法(在該方法在中實作權限認證,在這方法中,request.user就是當前登錄用戶)
# 3、如果有權限,回傳True
# 4、沒有權限,回傳False(定制回傳的中文: self.message='中文')
# 5、區域使用和全域使用
	-區域使用: # 在某個視圖類中設定介面(不會影響別的視圖類)
        class BookDetailView(ViewSetMixin, RetrieveAPIView):
            permission_classes = [CommonPermission]

	-全域使用:  # django的settings.py中配置,影響全域
    	REST_FRAMEWORK = {
            'DEFAULT_PERMISSION_CLASSES': [
                'app01.permissions.CommonPermission',
            ],
        }
  
	-區域禁用:# 全域配置區域禁用
        class BookDetailView(ViewSetMixin, RetrieveAPIView):
            permission_classes = [] 

(2)、代碼用法

models.py(修改User表的配置后需要重新進行資料庫遷移)

class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    user_type = models.IntegerField(choices=((1, '超級管理員'), (2, '普通用戶'), (3, '2B用戶')), default=2)

perssion.py(權限類代碼)

# 寫權限類,寫一個類,繼承基類BasePermission,重寫has_permission方法,在方法中實作權限認證,如果有權限return True ,如果沒有權限,回傳False
from rest_framework.permissions import BasePermission


class CommonPermission(BasePermission):
    def has_permission(self, request, view):
        # 實作權限的控制  ---》知道當前登錄用戶是誰?當前登錄用戶是  request.user
        if request.user.user_type == 1:
            return True
        else:
            # 沒有權限,向物件中放一個屬性 message
            # 如果表模型中,使用了choice,就可以通過  get_欄位名_display()  拿到choice對應的中文
            self.message = '您是【%s】,您沒有權限' % request.user.get_user_type_display()
            return False

views.py(視圖類代碼)

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 區域認證
    authentication_classes = [LoginAuth]
    # 權限認證(將撰寫的頻率類匯入過來)
    permission_classes = [CommentPermission]

image

三、頻率組件

簡介:

  • 頻率是指,控制某個介面訪問頻率(次數)

(1)、頻率組件的使用步驟

模塊地址:

from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
# BaseThrottle:需要手動撰寫的代碼較多
# SimpleRateThrottle: 需要手動撰寫的代碼較少(用這個)

用法簡介

# 1、創建一個專門用來撰寫頻率組件的py檔案,寫一個頻率類,繼承SimpleRateThrottle
# 2、重寫get_cache_key方法,回傳什么,就以什么做限制----》ip(用戶id做限制)
# 3、配置一個類屬性scope = 'book_5_m'
# 4、在django的組態檔中撰寫頻率次數
	REST_FRAMEWORK = {
          'DEFAULT_THROTTLE_RATES': {
            'book_5_m': '5/m',  # 一分鐘五次 
        },
    	}
# 5、區域使用和全域使用
	-區域使用: # 只影響當前的視圖類
    class BookView(ModelViewSet):
        throttle_classes = [CommentThrottle]
     
    -全域配置:影響全域
    	REST_FRAMEWORK = {
             'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.CommonThrottle'],

        }
     
    -區域禁用:
      class BookView(ModelViewSet):
         throttle_classes = [CommentThrottle]

(2)、代碼用法

throttle.py(頻率類代碼)

from rest_framework.throttling import BaseThrottle, SimpleRateThrottle


class CommentThrottle(SimpleRateThrottle):
    # 創建一個用于控制頻率的變數名(需要傳入組態檔)
    scope = 'book_5_m'

    def get_cache_key(self, request, view):
        # 回傳什么就以什么做限制(request.META.get('REMOTE_ADDR')以IP做限制)
        return request.META.get('REMOTE_ADDR')

視圖類代碼

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 頻率組件
    throttle_classes = [CommentThrottle]

django組態檔

REST_FRAMEWORK = {
    # 控制訪問頻率
    'DEFAULT_THROTTLE_RATES': {
        'book_5_m': '5/m',  # 一分鐘五次
    },
}

image

四、過濾的多種用法

簡介:

  • 過濾是指在使用查詢的時候,我們可以通過條件來過濾掉不需要的內容
# restful規范中,要求了,請求地址中帶過濾條件
	-5個介面中,只有一個介面需要有過濾和排序,查詢所有介面

(1)、繼承APIView自己寫

class BookView(APIView):
    def get(self,request):
        # 獲取get請求攜帶的引數
        name=request.query_params.get('name')
        # 通過filter進行過濾
        books = Book.objects.filter(name=name)

(2)、使用drf的內置過濾(繼承GenericAPIview)

模塊地址:
該方法為模糊查詢

from rest_framework.filters import SearchFilter

代碼用法:

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 實體化過濾物件
    filter_backends = [SearchFilter]
    # 指定過濾的欄位(模糊查詢)
    search_fields = ['name', 'price']

搜索方式:

# name或price中只要有關鍵字就會搜出來 (只能用search=xxx的方式)
	http://127.0.0.1:8000/api/v1/books/?search=西游記

image

(3)、使用第三方插件過濾(精準過濾)

第三方插件:

# 插件名稱:
	django-filter
    
# 安裝插件:
	pip3.8 install django-filter

模塊地址:

from django_filters.rest_framework import DjangoFilterBackend

代碼用法:

from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializer import BookSerializer
from django_filters.rest_framework import DjangoFilterBackend


class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # 第三方過濾插件
    filter_backends = [DjangoFilterBackend]
    # 查詢的欄位
    filterset_fields = ['pk','name', 'price']

搜索方式:

http://127.0.0.1:8000/api/books/?price=99
http://127.0.0.1:8000/api/books/?price=99&name=吶喊

image

4、使用過濾組件

1.定制過濾組件的使用方式與步驟

模塊地址:

from rest_framework.filters import BaseFilterBackend

用法簡介:

# 1、創建一個專門用于過濾的py檔案,寫一個類繼承BaseFilterBackend
# 2、重寫filter_queryset方法,在方法內部進行過濾
# 3、直接回傳過濾后的物件
# 4、如果沒有過濾直接回傳所有資料
# 5、區域使用
	 -區域使用:
    class BookView(ViewSetMixin, ListAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        # 在類表內填寫過濾的類
        filter_backends = [CommonFilter]  # 可以定制多個,從左往右,依次執行

2.代碼用法

過濾類代碼filters.py

from rest_framework.filters import BaseFilterBackend


class CommonFilter(BaseFilterBackend):
    # 重寫的類,撰寫過濾吧的內容
    def filter_queryset(self, request, queryset, view):
        # 獲取過濾的條件
        filter_comment = request.query_params.get('price_gt', None)
        # 判斷前端是否傳入過濾條件
        if filter_comment:
            # 根據條件進行賽選內容
            books_queryset_filter = queryset.filter(price__gt=100)
            # 回傳過濾后的資料
            return books_queryset_filter
        return queryset

視圖類代碼

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # 第三方過濾插件
    filter_backends = [CommonFilter]

五、排序的使用

用法簡介

  • 排序需要和自定義過濾繼承同一個父類,需要將排序的物件填入在過濾的串列內,并且放在其他引數的前方
    模塊地址:
from rest_framework.filters import OrderingFilter

(2)、代碼用法

視圖類代碼

from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializer import BookSerializer
from django_filters.rest_framework import DjangoFilterBackend
from .filters import CommonFilter
from rest_framework.filters import OrderingFilter


class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # 第三方過濾插件(OrderingFilter放在其他過濾引數前)
    filter_backends = [OrderingFilter, DjangoFilterBackend, CommonFilter]
    # 查詢的欄位
    filterset_fields = ['id', 'name', 'price']
    # 指定排序的欄位(-是降序,默認升序)
    ordering_fields = ['price']

搜索用法

# 默認升序
    http://127.0.0.1:8000/api/books/?price_gt=60&ordering=price
    
# 降序
	http://127.0.0.1:8000/api/books/?price_gt=60&ordering=-price

六、分頁

  • 分頁功能,只有查詢所有介面,才有分頁
  • drf內置了三個分頁器,對應三種分頁方式
  • 內置的分頁類不能直接使用,需要繼承,定制一些引數后才能使用

使用步驟

  • 步驟一:創建一個py檔案撰寫分頁用到的自定義類,分頁的三個類并不能直接使用,需要我們進行配置
  • 步驟二:撰寫這個自定義類
  • 步驟三:匯入視圖類中,并添加配置

代碼
page.py(自定義的分頁類)

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination


# 網頁用它
class CommonPageNumberPagination(PageNumberPagination):
    page_size = 2  # 每頁顯示2條
    page_query_param = 'page'  # page=10  查詢第10頁的資料,每頁顯示2條
    page_size_query_param = 'size'  # page=10&size=5    查詢第10頁,每頁顯示5條
    max_page_size = 5  # 每頁最大顯示10條

'''
page_size 每頁數目
page_query_param 前端發送的頁數關鍵字名,默認為”page”
page_size_query_param 前端發送的每頁數目關鍵字名,默認為None
max_page_size 前端最多能設定的每頁數量
'''
    
    
# LimitOffset
class CommonLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 3  # 每頁顯示2條
    limit_query_param = 'limit'  # limit=3   取3條
    offset_query_param = 'offset'  # offset=1  從第一個位置開始,取limit條
    max_limit = 5
    # offset=3&limit=2      0  1 2 3 4 5
'''
default_limit 默認限制,默認值與PAGE_SIZE設定一直
limit_query_param limit引數名,默認’limit’
offset_query_param offset引數名,默認’offset’
max_limit 最大limit限制,默認None
'''

# app 用下面

class CommonCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查詢引數
    page_size = 2  # 每頁多少條
    ordering = 'id'  # 排序欄位

'''
cursor_query_param:默認查詢欄位,不需要修改
page_size:每頁數目
ordering:按什么排序,需要指定
'''

views.py

#  分頁功能   必須是繼承GenericAPIView ,如果是繼承APIView,要自己寫(你寫)
from .page import CommonPageNumberPagination as PageNumberPagination
from .page import CommonLimitOffsetPagination as LimitOffsetPagination
from .page import CommonCursorPagination as CommonCursorPagination



class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    permission_classes = []
    authentication_classes = []
    throttle_classes = []
    # 之前的東西一樣用 ,內置的分頁類不能直接使用,需要繼承,定制一些引數后才能使用
    # pagination_class = PageNumberPagination
    #基本分頁方式(基本是這種,網頁端):http://127.0.0.1:8000/api/v1/books/?page=2&size=3

    # pagination_class = LimitOffsetPagination
    # 偏移分頁 http://127.0.0.1:8000/api/v1/books/?limit=4&offset=1
    # 從第一條開始,取4條

    pagination_class = CommonCursorPagination
    # 游標分頁,只能下一頁,上一頁,不能跳到中間,但它的效率最高,大資料量分頁,使用這種較好

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543214.html

標籤:其他

上一篇:day04-視圖和視圖決議器

下一篇:springboot3 security 從始至終--02 PasswordEncoder

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more