Django中DRF部分,十大組件

 ###################################################認(rèn)證實(shí)現(xiàn)
    自定義認(rèn)證的類
     """
     from rest_framework.authentication import BaseAuthentication
     from rest_framework.exceptions import AuthenticationFailed
     from authapp.models import UserToken

     class MyOrderAuthentication(BaseAuthentication):
            在這里實(shí)現(xiàn)認(rèn)證的邏輯
         def authenticate(self, request):
             token = request._request.GET.get('token')
             # 獲取到token之后痘系,需要在數(shù)據(jù)庫(kù)中查找token
             obj = UserToken.objects.filter(token=token).first()
             if not obj:
                 # 沒(méi)有通過(guò)認(rèn)證
                 raise AuthenticationFailed('認(rèn)證失敗')
             # 返回元組( user, auth )
             return (obj.user, obj)
     """

    使用局部配置(在視圖函數(shù)中)
     """
     class OrderView(APIView):

         # 通過(guò)authentication_classes設(shè)置認(rèn)證類
         authentication_classes = [MyOrderAuthentication,]

         # 通過(guò)authentication_classes設(shè)置為空列表,就不再進(jìn)行認(rèn)證了
         # authentication_classes = []

     """

    全局配置
     """
     REST_FRAMEWORK = {
         'DEFAULT_AUTHENTICATION_CLASSES':['unitls.authentication.MyOrderAuthentication'],
     }
     """

    設(shè)置匿名用戶
     """
     REST_FRAMEWORK = {
         'UNAUTHENTICATED_USER': lambda :"匿名用戶",
         'UNAUTHENTICATED_TOKEN': lambda :'123456',
     }
     """

    ## 最最重要的布近,理清認(rèn)證的源代碼


################################################################權(quán)限
 權(quán)限

   自定義權(quán)限類
   """
     from rest_framework.permissions import BasePermission

     class MyOrderPermission(BasePermission):
         #自定義權(quán)限認(rèn)證的類,必須要實(shí)現(xiàn)has_permission方法
         message = '你不是超級(jí)用戶餐屎,沒(méi)有權(quán)限訪問(wèn)'
         def has_permission(self, request, view):
         
             #Return `True` if permission is granted, `False` otherwise.
             #返回True表示有權(quán)限訪問(wèn),返回False表示沒(méi)有權(quán)限訪問(wèn)
             if request.user.user_type != 3:
                 return False
             return True
   """

   局部使用
   """
    class OrderView(APIView):
    
         # permission_classes設(shè)置權(quán)限類
         permission_classes = [MyOrderPermission,]
         # 通過(guò)authentication_classes設(shè)置為空列表,就不再進(jìn)行權(quán)限認(rèn)證了
         permission_classes = []
   """

   全局的設(shè)定
   """
    REST_FRAMEWORK = {
       'DEFAULT_PERMISSION_CLASSES':['unitls.permission.MyOrderPermission'],
    }
   """
   
   最最重要的此洲,理清權(quán)限認(rèn)證的源代碼


##############################################################節(jié)流
節(jié)流:
   自定義節(jié)流類
   """
    VISIT_RECORD = {}
    class VisitThrottle(object):

        def __init__(self):
            self.history = None

        def allow_request(self,request,view):
            #實(shí)現(xiàn)節(jié)流的邏輯
            #基于ip做節(jié)流
            # #獲取用戶訪問(wèn)的IP地址
            # ip_address = request._request.META.get('REMOTE_ADDR')
            ctime = time.time()
            # if ip_address not in VISIT_RECORD:
            #     #第一次訪問(wèn)的時(shí)候?qū)⒃L問(wèn)的時(shí)間存儲(chǔ)在字典中(ip地址為Key,訪問(wèn)的時(shí)間為value值)
            #     VISIT_RECORD[ip_address] = [ctime,]
            #
            # #第二次訪問(wèn)的時(shí)候取出訪問(wèn)的歷史記錄
            # history = VISIT_RECORD[ip_address]

            # 基于用戶的節(jié)流
            username = request.user.username
            if username not in VISIT_RECORD:
                VISIT_RECORD[username] = [ctime, ]
            history = VISIT_RECORD[username]
            self.history = history

            while history and history[-1] < ctime - 10:
                #如果訪問(wèn)的時(shí)間記錄超過(guò)60秒,就把超過(guò)60秒的時(shí)間記錄移除
                history.pop()

            if len(history) < 6:
                history.insert(0,ctime)
                return True

            return False

        def wait(self):
            #一旦用戶訪問(wèn)次數(shù)到達(dá)閥值,顯示用戶需要等待的時(shí)間
            ctime = time.time()
                        #09:54:30    09:54:28
            return 10 - (ctime - self.history[-1])
   """

   局部使用
   """
       class OrderView(APIView):
           # throttle_classes設(shè)置節(jié)流類
           throttle_classes = [VisitThrottle,]
   """
           
   全局設(shè)置
   """
    REST_FRAMEWORK = {
       'DEFAULT_THROTTLE_CLASSES':['unitls.throttle.VisitThrottle'],
    }
   """
   
   使用DRF內(nèi)置的限頻類
    """
    from rest_framework.throttling import SimpleRateThrottle
    
    #推薦使用這種
    class VisitThrottle(SimpleRateThrottle):
        #沒(méi)有登錄用戶畅厢,每分鐘訪問(wèn)10次
        scope = 'logined'
        def get_cache_key(self, request, view):
        return request.user.username
    """

   全局設(shè)置
    """
    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_RATES':{
            'unlogin':'10/m',
            'logined':'3/m',
        },
        'DEFAULT_THROTTLE_CLASSES':['unitls.throttle.VisitThrottle'],
    }
    """


#########################################################
關(guān)于版本控制
    自定義版本控制類
    """
        class ParmasVersion(object):
            def determine_version(self, request, *args, **kwargs):
                version = request.query_params.get('version')
                return version
    """

    使用(局部)
    """
        class VersionView(APIView):
            #設(shè)置獲取版本的類
            versioning_class = ParmasVersion
    """

    全局設(shè)置
    """
         'DEFAULT_VERSIONING_CLASS':'unitls.version.ParmasVersion',
    """

    使用 DRF內(nèi)置的版本控制類QueryParameterVersioning(局部)
    """
        from rest_framework.versioning import QueryParameterVersioning
        class VersionView(APIView):
            #設(shè)置獲取版本的類
            versioning_class = QueryParameterVersioning
    """
    
    設(shè)置文件中的配置信息
    """
        REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
        }
    """

    全局設(shè)置
    """
        REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
            'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',
        }
    """


    使用 DRF內(nèi)置的版本控制類URLPathVersioning(局部)
    """
        from rest_framework.versioning import URLPathVersioning
        class VersionView(APIView):
            #設(shè)置獲取版本的類
            versioning_class = URLPathVersioning
        """
    
    設(shè)置文件中的配置信息
    """
        REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
        }
        """
    
    全局設(shè)置
    """
        REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
            'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
        }
    """

    如果使用URLPathVersioning,路由格式如下
    """
        url(r"^(?P<version>[v1|v2]+)/version/",VersionView.as_view(),name='vvvv')
    """

    #使用 DRF內(nèi)置的版本控制類URLPathVersioning 反向生成url地址
    """
        #反向生成url地址 reverse
        obj = request.versioning_scheme
        url1 = obj.reverse(viewname='orders',request=request)
        
        #使用django的reverse方法反響生成url地址
        from django.urls import reverse
        url2 = reverse(viewname='orders',kwargs={'version':'v2'})
    """

#################################################解析器

因?yàn)殚_發(fā)人員post請(qǐng)求上傳數(shù)據(jù)時(shí)元莫,傳遞的數(shù)據(jù)類型不同赖阻,我們可能在request._request.POST中獲取不到數(shù)據(jù)

    case1: Content-Type : application/x-www-form-urlencoded
    服務(wù)端接收到的post請(qǐng)求的數(shù)據(jù)格式:username=xxxxx&age=18&sex=男
    我們就可以在request._request.POST中獲取到數(shù)據(jù)
    """
        class UserInfoView(APIView):
            def post(self,request,*args,**kwargs):
                username = request._request.POST.get('username')
                age = request._request.POST.get('age')
                sex = request._request.POST.get('sex')
    """

    case2:Content-Type:application/json
    服務(wù)端接收到的post請(qǐng)求的數(shù)據(jù)格式就是json數(shù)據(jù):{"username":"xxxx","age":"18","sex":"男"}
    在request._request.POST中就獲取不到數(shù)據(jù),但是在request.body中可以拿到
    """
        class UserInfoView(APIView):
            def post(self,request,*args,**kwargs):
                import json
                data = json.loads(request.body.decode('utf8'))
                print(data)
    """

    DRF內(nèi)置的解析器FormParser,JSONParser
    使用(局部):
    """
       from rest_framework.parsers import FormParser,JSONParser
       class UserInfoView(APIView):
            parser_classes = [FormParser,JSONParser]
            
            #這時(shí)DRF 內(nèi)部代碼會(huì)根據(jù)request.Content-Type和解析器支持的media_type比較
            從而選擇對(duì)應(yīng)的解析器
            
            def post(self,request,*args,**kwargs):
                # 如果使用JSONParser踱蠢、FormParser解析數(shù)據(jù)的話
                data = request.data
                print(data)
            
    """

    使用(全局配置解析器):


#############################################################
關(guān)于序列化
    Django的序列化
    """
    #django序例化方式一
    books = models.BookInfo.objects.all().values('id','bookname')
    books = list(books)
    print(type(books), books)
    self.ret['books'] = books

    #django序例化方式二
    books = models.BookInfo.objects.all()
    books = [model_to_dict(item) for item in books]
    self.ret['books'] = books
    """

    DRF 序列化
    第一種:繼承自serializers.Serializer
    """
         class BookDetailSerializer(serializers.Serializer):
                 # 正常的字段序列化
                 id = serializers.IntegerField()
                 bookname = serializers.CharField()
                 author = serializers.CharField()
                 category = serializers.IntegerField()
                 bookdesc = serializers.CharField()
                 
                 
                 # 獲取枚舉類型的文本是 source=get_字段名_display
                 status = serializers.CharField(
                     source='get_status_display'
                 )
                 categoryname = serializers.CharField(
                     source='get_category_display'
                 )
                 
                 # 自定義方法獲取字段
                 chpaters = serializers.SerializerMethodField()
                 #序列化時(shí)可以自定義方法獲取字段
                 def get_chpaters(self,row):
                     """ row - > bookinfo """
                         chpaters = models.ChpaterInfo.objects.filter(book=row)
                         ser = ChpaterSerializer(instance=chpaters,many=True,
                                                 context=self.context
                                                 )
                         return ser.data
    """
     序列化時(shí)生成url
    """
        url = serializers.HyperlinkedIdentityField(
        view_name='chpaterdetail', lookup_field='id',
        lookup_url_kwarg='pk',
        )
    """
    注意:如果序列化類中使用HyperlinkedIdentityField生成url,那我們?cè)谛蚶瘯r(shí)添加context={'request': request}
    """
        ser = BookDetailSerializer(
        instance=obj,many=False,
        context={'request': request}
        )
    """

    如果出現(xiàn)關(guān)聯(lián)關(guān)系時(shí)火欧,獲取model對(duì)像的某一個(gè)字段
    """
        bookname = serializers.CharField(source='book.bookname')
    """

    第二種繼承自:serializers.ModelSerializer
    """
    class ChpaterDetailSerializer(serializers.ModelSerializer):
        #使用ModelSerializer進(jìn)行章節(jié)詳情的序列化
        bookname = serializers.CharField(source='book.bookname')
        class Meta:
            model = models.ChpaterInfo
            #fields = "__all__"
            fields = ['id','bookname']
    """
    
    DRF (序列化時(shí))自定義方法獲取數(shù)據(jù)
    """
        book = serializers.SerializerMethodField()
    """
    """
         def get_book(self,row):
             """ row - > UserInfo"""
                 print('======',row.book.all())
                 ser = UsersBooksSerializer(
                     instance=row.book.all(),
                     many=True
                 )
            
                 return ser.data
    """
    
    DRF depth深度的使用
    # depth會(huì)根據(jù)關(guān)聯(lián)的數(shù)據(jù)不停的深入將數(shù)據(jù)獲取出來(lái)(最多不超過(guò)10層)
    # depth = 1
    """
    class UsersSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.UserInfo
            fields = "__all__"
            #depth會(huì)根據(jù)關(guān)聯(lián)的數(shù)據(jù)不停的深入將數(shù)據(jù)獲取出來(lái)(最多不超過(guò)10層)
            depth = 1
    """

    DRF序列化的驗(yàn)證功能
    """
    class UsersSerializer(serializers.ModelSerializer):
        #自定義驗(yàn)證錯(cuò)誤的信息
        username = serializers.CharField(error_messages={'required':'用戶名不能為空'})
        class Meta:
            model = models.UserInfo
            fields = "__all__"
    """

    """
    class UsersView(APIView):
        def post(self,request,*args,**kwargs):
        """DRF 序列化自帶驗(yàn)證功能"""
            data = request.data
            #print(data)
            ser = UsersSerializer(data=data)
            if ser.is_valid(): # ser.is_valid()y驗(yàn)證數(shù)據(jù)的有效性
                print('驗(yàn)證后的數(shù)據(jù)',ser.validated_data)
                #驗(yàn)證后的數(shù)據(jù)正確后,保存數(shù)據(jù)至數(shù)據(jù)庫(kù)
                ser.save()
            else:
                #上傳數(shù)據(jù)不符合規(guī)范時(shí)ser.errors,返回錯(cuò)誤詳細(xì)
                print(ser.errors)
            return Response(data)
    """

    自定義字段驗(yàn)證規(guī)則
    """
        class UsersInfoSerializer(serializers.ModelSerializer):
        username = serializers.CharField(error_messages={'required':'用戶名不能為空'})
            class Meta:
                model = models.UserInfo
                fields = "__all__"
            
            # 用戶名中必須包含老王兩個(gè)字,不包含則認(rèn)為名字無(wú)效
            def validate_username(self,validated_value):
                print(validated_value)
                from rest_framework.exceptions import ValidationError
                if '老王' not in validated_value:
                #驗(yàn)證不通過(guò),拋出異常
                    raise ValidationError('用戶名不合法')
                #驗(yàn)證通過(guò)苇侵,返回?cái)?shù)據(jù)
                return validated_value
    """

#########################################分頁(yè)

  自定義分頁(yè)類PageNumberPagination
    # 自定制分頁(yè)類
    class MyPageNumberPagination(PageNumberPagination):
        """http://127.0.0.1:8000/api/userpage/?page=1&pagesize=10"""
        # page_size每一返回多少條
        page_size = 5
        # 設(shè)置分頁(yè)的參數(shù)名
        page_query_param = 'page'
        # 設(shè)置每頁(yè)返回?cái)?shù)據(jù)量的參數(shù)名
        page_size_query_param = 'pagesize'
        # 設(shè)置每頁(yè)最大返回的條數(shù)
        max_page_size = 6

  使用
      class UsersPageView(APIView):
          
          def get(self,request,*args,**kwargs):
              # 獲取表中所有用戶的row(記錄)
              obj = models.UserInfo.objects.all()
              #實(shí)例化分頁(yè)的類
              #page_obj = PageNumberPagination()
              page_obj = MyPageNumberPagination()
              #獲取分頁(yè)數(shù)據(jù)
              page_data = page_obj.paginate_queryset( queryset=obj,request=request,view=self)
              # 序列化
              ser = UsersSerializer(instance=page_data,many=True)

              # return Response(ser.data)
              #get_paginated_response會(huì)返回上一頁(yè)下一頁(yè)和總條數(shù)
              return page_obj.get_paginated_response(ser.data)

    自定義分頁(yè)類LimitOffsetPagination
    from  rest_framework.pagination import LimitOffsetPagination

    class MyLimitOffsetPagination(LimitOffsetPagination):
        """http://127.0.0.1:8000/api/userpage/?limit=10&offset=0"""
        default_limit = 5
        limit_query_param = 'limit'
        offset_query_param = 'offset'
        max_limit = 7

    
    自定義分頁(yè)類CursorPagination(會(huì)對(duì)分頁(yè)參數(shù)進(jìn)行加密)
    from  rest_framework.pagination import CursorPagination

    class MyCursorPagination(CursorPagination):
        """http://127.0.0.1:8000/api/userpage/?cursor=cD01"""
        cursor_query_param = 'cursor'
        page_size = 4
        #返回?cái)?shù)據(jù)市的排序的方式
        ordering = '-id'
        max_page_size = 8

     設(shè)置全局的分頁(yè)
     """
         REST_FRAMEWORK = {
             'DEFAULT_PAGINATION_CLASS':'unitl.pagination.MyCursorPagination',
             'PAGE_SIZE':3
         }
     """


###########################
視圖
    以前 (Django的View)
    """
        class MyView(View)
            .....
    """

    現(xiàn)在(rest_framework的APIView)
    """
        class MyView(APIView)
        .....
    """
    
    其他視圖的使用
    第一個(gè):GenericAPIView 視圖的使用 (跟繼承自APIViewq其實(shí)一樣赶盔,只是我們?cè)谕饷孢壿嫞?        GenericAPIView在內(nèi)部c定制方法幫我們實(shí)現(xiàn)了)
    """
    from rest_framework.generics import GenericAPIView

    class BookinfoSeralizer(serializers.ModelSerializer):
        
        class Meta:
            model = models.BookInfo
            fields = "__all__"

    class BookView(GenericAPIView):
        # queryset: 設(shè)置獲取的數(shù)據(jù)
        queryset = models.BookInfo.objects.all()
        # serializer_class: 設(shè)置序列化的類
        serializer_class = BookinfoSeralizer
        # pagination_class : 設(shè)置分頁(yè)的類
        pagination_class = MyPageNumberPagination
        def get(self,request,*args,**kwargs):
            obj = self.get_queryset() #=> obj = models.BookInfo.objects.all()
            # 獲取當(dāng)前分頁(yè)的數(shù)據(jù)
            page_data = self.paginate_queryset(obj) #=>page_obj = MyPageNumberPagination() #獲取分頁(yè)數(shù)據(jù)page_data = page_obj.paginate_queryset()
            # 獲取序列化之后的數(shù)據(jù)
            ser = self.get_serializer(instance=page_data,many=True) #->ser = BookinfoSeralizer(instance=page_data,many=True)
            return Response(ser.data)
    """
        
     第二個(gè):GenericViewSet 視圖的如下使用,注意路由會(huì)發(fā)生變化
        """
        class BookView(GenericViewSet):
            # queryset: 設(shè)置獲取的數(shù)據(jù)
            queryset = models.BookInfo.objects.all()
            # serializer_class: 設(shè)置序列化的類
            serializer_class = BookinfoSeralizer
            # pagination_class : 設(shè)置分頁(yè)的類
            pagination_class = MyPageNumberPagination
            
            def list(self,request,*args,**kwargs):
                
                obj = self.get_queryset() #=> obj = models.BookInfo.objects.all()
                # 獲取當(dāng)前分頁(yè)的數(shù)據(jù)
                page_data = self.paginate_queryset(obj) #=>page_obj = MyPageNumberPagination() #獲取分頁(yè)數(shù)據(jù)page_data = page_obj.paginate_queryset(
                # 獲取序列化之后的數(shù)據(jù)
                ser = self.get_serializer(instance=page_data,many=True) #->ser = BookinfoSeralizer(instance=page_data,many=True)
                
                return Response(ser.data)
        """
        路由會(huì)發(fā)生變化榆浓,配置如下
        """
        url(r"bookpage/$",views.BookView.as_view({'get': 'list'}),name='bookpage')
        """
        
        第三個(gè):ListModelMixin,CreateModelMixin,RetrieveModelMixin,
        DestroyModelMixin,UpdateModelMixin 等視圖的使用
        
        """
        from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin
        from rest_framework.viewsets import GenericViewSet
        # ListModelMixin : 返回列表數(shù)據(jù)據(jù)( get請(qǐng)求)
        # CreateModelMixin  : 新增一條數(shù)據(jù) (Post請(qǐng)求)
        # RetrieveModelMixin,  : 獲取詳情數(shù)據(jù) (get請(qǐng)求)
        # DestroyModelMixin,   : 刪除數(shù)據(jù)的時(shí)候 (delete)
        # UpdateModelMixin  : 跟新數(shù)據(jù)的時(shí)候使用 (put)

        class BookView(ListModelMixin,RetrieveModelMixin,CreateModelMixin,DestroyModelMixin,UpdateModelMixin,GenericViewSet):
            # queryset: 設(shè)置獲取的數(shù)據(jù)
            queryset = models.BookInfo.objects.all()
            # serializer_class: 設(shè)置序列化的類
            serializer_class = BookinfoSeralizer
            # pagination_class : 設(shè)置分頁(yè)的類
            pagination_class = MyPageNumberPagination
        """

        第四個(gè):ModelViewSet視圖的使用
        ModelViewSet繼承自istModelMixin,CreateModelMixin,
        RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin視圖
        如果要實(shí)現(xiàn)最基本的增刪改查功能于未,就直接繼承自ModelViewSet
        """
        from rest_framework.viewsets import ModelViewSet
        class BookView(ModelViewSet):
            # queryset: 設(shè)置獲取的數(shù)據(jù)
            queryset = models.BookInfo.objects.all()
            # serializer_class: 設(shè)置序列化的類
            serializer_class = BookinfoSeralizer
            # pagination_class : 設(shè)置分頁(yè)的類
            pagination_class = MyPageNumberPagination
        """

        視圖使用小總結(jié)
            只想實(shí)現(xiàn)簡(jiǎn)單的增刪改查
                ModelViewSet
            只想增
                CreateModelMixin,GenericViewSet
            只想增刪改
                CreateModelMixin,DestroyModelMixin,UpdateModelMixin,GenericViewSet

            如果視圖中的業(yè)務(wù)邏輯復(fù)雜,以上都不能滿足的時(shí)候哀军,直接使用
                APIView

     #自動(dòng)路由配置
     """
         from django.conf.urls import url,include
         from api import views
         from rest_framework import routers
         
         router = routers.DefaultRouter()
         router.register(r"bookpage",views.BookView,base_name='bookpage')
         
         
         urlpatterns = [
            url(r'v1/',include(router.urls)),
         ]
     """
         
    自動(dòng)路由會(huì)生成四個(gè)接口
    ^api/ v1/ ^bookpage/$ [name='bookpage-list']
    ^api/ v1/ ^bookpage\.(?P<format>[a-z0-9]+)/?$ [name='bookpage-list']
    ^api/ v1/ ^bookpage/(?P<pk>[^/.]+)/$ [name='bookpage-detail']
    ^api/ v1/ ^bookpage/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='bookpage-detail']

##############################渲染器

    INSTALLED_APPS = [
                      'rest_framework',
                     ]

    from rest_framework.renderers import BrowsableAPIRenderer,JSONRenderer,AdminRenderer

    class BookView(ModelViewSet):
        # 設(shè)置渲染器類型
        renderer_classes = [JSONRenderer]

############################################

認(rèn)證 ***
權(quán)限(授權(quán)) ***
用戶訪問(wèn)次數(shù)/頻率限制 ***
版本 ***
解析器(parser)**
序列化 ****
分頁(yè) ***
路由系統(tǒng) **
視圖 **
渲染器 *












?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沉眶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子杉适,更是在濱河造成了極大的恐慌谎倔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猿推,死亡現(xiàn)場(chǎng)離奇詭異片习,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蹬叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門藕咏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秽五,你說(shuō)我怎么就攤上這事孽查。” “怎么了坦喘?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵盲再,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓣铣,道長(zhǎng)答朋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任棠笑,我火速辦了婚禮梦碗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓖救。我一直安慰自己洪规,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布循捺。 她就那樣靜靜地躺著淹冰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巨柒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音洋满,去河邊找鬼晶乔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牺勾,可吹牛的內(nèi)容都是我干的正罢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼驻民,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翻具!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起回还,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤裆泳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后柠硕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體工禾,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蝗柔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闻葵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡癣丧,死狀恐怖槽畔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胁编,我是刑警寧澤厢钧,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站掏呼,受9級(jí)特大地震影響坏快,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憎夷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一莽鸿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拾给,春花似錦祥得、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至额衙,卻和暖如春饮焦,著一層夾襖步出監(jiān)牢的瞬間怕吴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工县踢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留转绷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓硼啤,卻偏偏與公主長(zhǎng)得像议经,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谴返,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容