精华内容
下载资源
问答
  • from django.urls import path from . import views urlpatterns = [ ]
  • 主要介绍了Django DRF APIView源码运行流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了Django DRF路由与扩展功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要给大家介绍了关于django DRF图片路径问题的解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了Django DRF认证组件流程实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了django drf框架中的user验证以及JWT拓展的介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • django-firebase-auth:用于Google Firebase身份验证服务的Django DRF身份验证提供程序
  • django drf 项目报错

    千次阅读 2019-07-15 19:04:58
    django drf 项目报错 The `actions` argument must be provided when calling `.as_view()` on a ViewSet. For example `.as_view({'get': 'list'})` url是这么写的 url(r'^orders/$', orders.OrdersViewSet.as_...

    django drf 项目报错

    The `actions` argument must be provided when calling `.as_view()` on a ViewSet. For example `.as_view({'get': 'list'})`
    

    url是这么写的

    url(r'^orders/$', orders.OrdersViewSet.as_view())
    

    因为返回的ModelViewSet是带pagination_class分页器的,所以路由要自动生成,改成下面这样。

    router = DefaultRouter()
    router.register('orders', orders.OrdersViewSet, base_name='orders')
    urlpatterns += router.urls
    
    展开全文
  • django DRF test_plus nose

    2020-04-17 15:38:05
    django项目中使用test_plus 写测试用例 安装 pip installdjango-test-plus 在项目中创建test文件夹 注意 文件夹名称 不能是tests 否则使用...django DRF 接口测试 from django.test import Client from test_...

    django项目中使用 test_plus 写测试用例

    安装 pip install django-test-plus

    在项目中创建test文件夹  

    注意 文件夹名称 不能是tests  否则使用 python manage.py test 运行测试用例的时候会报错

    django DRF 接口测试

    from django.test import Client
    from test_plus import TestCase
    from rest_framework.test import APIClient
    
    
    class APITestCase(TestCase):
    	client_class = APIClient
    
    
    class MyAPITestCase(APITestCase):
    
    	def setUp(self):
    		self.user = self.make_user()
    		self.client = Client()
    
    
    	def test_login(self):
    		data = {'username': "testuser","password":"password"}
    		res = self.post("/u/login/",data=data,extra={'format': 'json'})
    		self.response_201()
    		print(res)
    		# todo 上下这两种方式都可以
    		response = self.client.post("/u/login/",data=data,extra={'format': 'json'})
    		print(response.status_code)
    		print(response.data)
    		assert response.status_code == 201
    

     

    跑测试用例

    在项目文件夹中 python manage.py test

    生成html 测试报告 nose

    pip install nose
    pip install django-nose
    pip install nose-htmloutput

    django项目的setting.py中添加:

    INSTALLED_APPS = [
      ...
      'django_nose'
      ]

    TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

     

    项目文件夹中运行 t.html  是我要生成的出报告文件(可以自定义生成到自己定义的文件夹中)

    (fk) F:\django\dj3>python manage.py test --with-html --html-file=t.html

    1指定只测试某个文件下的测试用例

    python manage.py test users.test.test_view 

    生成报告  python manage.py test users.test.test_view  --with-html --html-file=t1.html

     

    2指定只测试某个文件下的某个测试用例

    python manage.py test users.test.test_view:MyAPITestCase.test_login

    生成报告  python manage.py test users.test.test_view:MyAPITestCase.test_login  --with-html --html-file=t1.html

     

    生成测试报告 打开t.html 看到

     

    直接用nose测试django项目。不用python manager.py test命令,而用nosetests加载tests.py进行测试。测试需要django环境,所以在tests.py开头加上:
      import os
      os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

      import django
      django.setup()

    运行命令 nosetests --with-html --html-file=/path/to/htmlfile

    nosetests --with-coverage --with-xunit  --cover-erase &&  coverage xml

     

     

    展开全文
  • drfdjango框架的一个插件,所以要先安装django; 安装命令:pip3 install djangorestframework 使用drf时,要在settings中注册 1、注册功能 – 实例 --在生活中的实例 创建模型 用于注册和登录使用 # ...

    DRF框架简介

    • drf是django框架的一个插件,所以要先安装django;
    • 安装命令:pip3 install djangorestframework
    • 使用drf时,要在settings中注册

    1、注册功能

    – 实例 --在生活中的实例

    在这里插入图片描述

    • 创建模型 用于注册和登录使用
    # 在 model.py 中创建模型(表)  以User为例
    from django.db import models
    
    class User(models.Model):
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=128, default=True)
    
        def __str__(self):     
            return self.username
    
        class Meta:
            db_table = 'user'
    
    • 创建序列化器

      在自建 app下创建serializer.py 文件,写序列化工具 使用ModelSerializer

    from rest_framework import serializers
    from .models import User
    
    class UserModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = '__all__'
    
    • 功能实现
    from django.contrib.auth.hashers import make_password
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    from .serializers import UserModelSerializer
    from .models import User
    
    class RegisterView(APIView):
        def post(self, request):
            username = request.data.get('username')
            password1 = request.data.get('password1')
            password2 = request.data.get('password2')
            if User.objects.filter(username=username):
                return Response({'msg': '该用户已注册!', 'code': 400})
            else:
                if password1 == password2:
                    user_data = {'username': username, 'password': make_password(password1)}
                    user_serializer = UserModelSerializer(data=user_data)
                    if user_serializer.is_valid():
                        user_serializer.save()
                        return Response({'msg': '注册成功!', 'code': 200})
                    else:
                        return Response({'msg': user_serializer.errors, 'code': 400})
                else:
                    return Response({'msg': '两次密码不一致!', 'code': 400})
    

    完成上面的操作之后,配置路由查看效果!!!

    2、登录功能

    使用上面的序列化器 和 模型 !!!

    登录

    • 功能实现
    # 在views.py 中写功能  登录成功后带的参数用于状态保持
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    from django.contrib.auth.hashers import check_password
    
    from .models import User
    
    class LoginView(APIView):
        def post(self, request):
            username = request.POST.get('username')
            password = request.POST.get('password')
            user = User.objects.filter(username=username).first()
            if user and check_password(password, user.password):
                return Response({'msg': '登录成功', 'code': 200, 'user_id': user.id})
            else:
                return Response({'msg': '登录失败', 'code': 400})
    

    完成上面的操作之后,配置路由查看效果!!!

    3、分页功能

    • 创建模型

    以新闻为例 可以创建一对多,多对多模型,此处以单标为例!

    from django.db import models
    
    class News(models.Model):
        title = models.CharField(max_length=64)
        context = models.TextField()
        stars = models.IntegerField()
    
        def __str__(self):
            return self.title
    
        class Meta:
            db_table = 'news'
    
    • 创建序列化器
    class NewsModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = News
            fields = '__all__'
    
    • 后端代码
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    from django.core.paginator import Paginator
    
    from .serializers import NewsModelSerializer
    from .models import News
    
    
    class NewsPage(APIView):
        """分页"""
    
        def get(self, request):
            # 获取当前页
            current_page = request.query_params.get('current_page')
            # 获取每页显示的数量
            page_size = request.query_params.get('page_size')
            # 获取所有的数据
            news_list = News.objects.all()
            # 实例化分页器
            paginotor = Paginator(news_list, page_size)
            # 获取当前页的数据
            paged = paginotor.page(current_page)
            # 序列化
            news_serializer = NewsModelSerializer(paged, many=True)
            # 返回数据
            return Response({
                'data': news_serializer.data,
                'page_list': [i for i in paginotor.page_range],
                'page_sum': paginotor.num_pages
    

    接口地址:http://127.0.0.1:8000/app01/news/

    请求方法:GET

    请求参数:current_page(当前页) page_size(每页展示几条数据)

    • 前端代码 vue 工具:WebStorm
    <template>
      <div>
        <h3 class="t1">新闻展示页面</h3>
        <hr class="t1">
        <table class="t1">
          <tr>
            <td>新闻编号</td>
            <td>新闻标题</td>
            <td>新闻内容</td>
            <td>新闻点赞</td>
          </tr>
          <tr v-for="item in news_list">
            <td>{{item.id}}</td>
            <td>
              <!--  点击跳转详情页  -->
              <router-link :to="{name:'NewsDetail',query:{'news_id':item.id}}">{{item.title}}</router-link>
            </td>
            <td>{{item.context}}</td>
            <td>{{item.stars + '人'}}</td>
          </tr>
          <tr>
            <td colspan="5" class="td1"></td>
          </tr>
          <tr>
            <td colspan="5">
              <button @click="upPage">上一页</button>
              <button v-for="item in page_list" @click="jump(item)">{{item}}</button>
              <button @click="downPage">下一页</button>
            </td>
          </tr>
        </table>
      </div>
    </template>
    
    <script>
      import axios from 'axios'
    
      export default {
        data() {
          return {
            current_page: 1,
            page_size: 2,
            news_list: [],
            page_list: []
          }
        },
        methods: {
          // 上一页
          upPage() {
            if (this.current_page > 1) {
              this.current_page--
              this.getnews()
            }
          },
          // 下一页
          downPage() {
            if (this.current_page < this.page_list.length) {
              this.current_page++
              this.getnews()
            }
          },
          // 点击跳转
          jump(page) {
            this.current_page = page
            this.getnews()
          },
          getnews() {
            this.axios({
              url: 'app01/newspage/',
              params: {'current_page': this.current_page, 'page_size': this.page_size}
            }).then(res => {
              this.news_list = res.data.data
              console.log(this.news_list)
              this.page_list = res.data.page_list
            })
          }
        },
        created() {
          this.getnews()
        }
      }
    </script>
    
    <style scoped>
      .t1 {
        margin: 15px auto;
        width: 80%;
        text-align: center;
      }
    
      .td1 {
        height: 40px;
      }
    
    </style>
    
    
    • 前端点击跳转详情页
    <router-link :to="{name:'NewsDetail',query:{'news_id':item.id}}">
    <-- 跳转至详情页之后,获取路由中的参数 --!>
    news_id = this.$route.query.news_id 
    

    使用axios 请求后端的数据(详情数据)

    • 后端功能
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    from .serializers import NewsModelSerializer
    from .models import News
    	
    class NewsView(APIView):
       """获取详情页面"""
        def get(self, request):
            news_id = request.query_params.get('news_id')
            news_obj = News.objects.filter(pk=news_id)
            news_serializer = NewsModelSerializer(news_obj, many=True)
            return Response(news_serializer.data)
    

    4、删除功能

    5、修改功能

    6、前端状态保持

    京东\淘宝

    用户名+密码 先登录 + token user_id

    <-- 传入需要保持的数据 --!>
    localStorage.setItem('user_id', res.data.user_id) 
    

    4、删除功能

    5、修改功能

    6、前端状态保持

    京东、淘宝等网站都需要!!!

    用户名+密码 先登录 + token user_id

    <-- 传入需要保持的数据 --!>
    localStorage.setItem('user_id', res.data.user_id) 
    
    关注我 明天完善删除和修改功能!!!感谢支持,留下一间三连呗 么么哒~
    
    展开全文
  • django drf (过滤、搜索、排序、分页)

    千次阅读 2019-05-06 16:32:07
    django drf (过滤、搜索、排序、分页) 1.过滤 参考官网:https://django-filter.readthedocs.io/en/master/guide/install.html 在写django drf的时候会遇到搜索,以及过滤的情况。django-filter就可以很好的满足...

    django drf (过滤、搜索、排序、分页)

    1.过滤

    1. 参考官网:https://django-filter.readthedocs.io/en/master/guide/install.html

    2. 在写django drf的时候会遇到搜索,以及过滤的情况。django-filter就可以很好的满足我们。

    3. 本篇文章写的并不复杂,主要让读者入门,然后阅读官网进阶

    4. pip安装
      pip install django-filter

    5. 安装完之后,加入到 INSTALLED_APPS
      INSTALLED_APPS = [

      ‘django_filters’,
      ]

    6. 建立一个filter.py文件名字自定义

    7. filter.py
      import django_filters
      from .models import RegistrationManager #RegistrationManager:models数据库

      class RegistrationManagerFilter(django_filters.FilterSet):
          # field_name :数据库字段名字 ,lookup_expr:参数
          min_date = django_filters.DateFilter(field_name='time', lookup_expr='gte')
          max_date = django_filters.DateFilter(field_name='time', lookup_expr='lte')
          #min_date,max_date:时间过滤
      
          class Meta:
              model = RegistrationManager
              # fields = '__all__'
              fields = ['id', 'department', 'doctor', 'min_date', 'max_date']
              models:指定数据库
              fields:指定数据库的字段名
      
    8. views.py
      from rest_framework.viewsets import ModelViewSet
      from django_filters.rest_framework import DjangoFilterBackend
      from django_filters import rest_framework
      from .filter import RegistrationManagerFilter#自己创的文件

      class RegistrationManagerView(ModelViewSet):
          queryset = RegistrationManager.objects.all().order_by()
          serializer_class = RegistrationManagerSerializer
          filter_backends = (rest_framework.DjangoFilterBackend, )  
          filter_class = RegistrationManagerFilter
          #添加filter_backends并设置  
          #并且把filter的class加入到filter_calss就可以了
      
    9. 运行结果
      在这里插入图片描述

    2.搜索,过滤

    1. 和过滤一样,下载django-filter并加入到INSTALLED_APPS中

    2. 接续编写views.py
      from rest_framework.viewsets import ModelViewSet
      from django_filters.rest_framework import DjangoFilterBackend
      from django_filters import rest_framework
      from .filter import RegistrationManagerFilter#自己创的文件

      class RegistrationManagerView(ModelViewSet):
          queryset = RegistrationManager.objects.all().order_by()
          serializer_class = RegistrationManagerSerializer
          filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter,filters.OrderingFilter,) 
          filter_class = RegistrationManagerFilter
          search_fields = ('name', 'id', 'department__patient_name', 'doctor__username')
          ordering_fields = ('name', 'first_visit', 'state', 'id')
          #如果有外键,在search_fields中加入一个外键的名字是不能查询的,要写成(外键名__外键中的字段名)
          
       	#和过滤不一样的是,需要加入filters.SearchFilter,filters.OrderingFilter
       	#filters.SearchFilter:用于搜索
       	#filters.OrderingFilter:用于排序
       	#ordering_fields:可以设置排序方式
       	
       	
       	#当然搜索也可以进行设置
       		#‘^’:以 xx 字符串开始
      		#‘=’:完全匹配
      		#‘@’:全文搜索(目前只支持Django的MySQL后端)
      		#$表示以什么结尾
      		#‘$’:正则表达式搜索
      
    3. 搜索的时候,经常会遇到外键,表之间的关系所以需要简单的处理一下,如果有外键,在search_fields中加入一个外键的名字是不能查询的,要写成(外键名__外键中的字段名)

    4. 效果图
      在这里插入图片描述

    3.接写来就是分页啦

    1. 分页还是很简单的
    2. 在setting.py加入以下代码即可
      REST_FRAMEWORK = {
      ‘DEFAULT_PAGINATION_CLASS’: ‘rest_framework.pagination.PageNumberPagination’,
      ‘PAGE_SIZE’: 100 # 每页数目
      }

    还可以自定义传统分页类 - 重写 PageNumberPagination,不过现在还没用到就先不写了

    展开全文
  • Django DRF 常用场景 今天给大家总结了利用APIView实现商业网站中的一些小功能,从注册登录到下删改查,基本上是偏向于后端的代码,读完的小伙伴们记得留下一键三连支持下博主哦! DRF框架简介 drfdjango框架...
  • 主要介绍了django-drf框架自带的路由以及最简化的视图,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • django DRF 创建模型类的时候数据类型有没有变长字符串啊,目前只知道 CharField(max_length=200)是mysql里的char类型,有的时候数据长度波动大,比如大多就20个长度左右,但是有一部分有500多的长度,或者不知道...
  • 文章目录一、Django drf 序列化器类to_representation如何使用示例:例如处理返回的日期格式二、参考 一、Django drf 序列化器类 DRF所有序列化器类都继承了BaseSerializer 类, 通过重写该类的 to_representation()...
  • django drf Filter

    2019-04-04 19:13:00
    1.定义get_queryset()...from django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_fram...
  • django drf fields

    2018-12-28 00:38:45

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,426
精华内容 3,770
关键字:

djangodrf