java 类视图_第 4 篇:用类视图实现首页 API

d47e39787377d39eb89c23fb246e306e.png

作者:HelloGitHub-追梦人物

> 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库

django-rest-framework 类视图拓展自 django 的类视图,只是针对数据的序列化和反序列化等逻辑做了封装。

django-rest-framework 中最基本的类视图是 views.APIView,这个类可以看成是上一篇教程中用到的 api_view 装饰器的类版本。这个类比较基础,其核心功能就是 HTTP 请求预处理、分发请求给对应的处理函数,以及 HTTP 响应后处理,还有就是 as_view 方法将类转为函数(要注意与被请求的 URL 绑定的视图必须是一个可调用对象,普通的的类是无法被直接调用的)。除非需要深度定制视图函数的逻辑,一般情况下我们的视图不会直接继承这个类。

更为通用的类视图是 GenericAPIView,这个类继承自 APIView,对基类的功能做了拓展。继承自这个类的视图,只需对其类属性做一些简单的配置,就能获得获取单个资源、获取资源列表、资源列表分页等功能。当然,这个类作为其他特定功能类视图的基类,我们一般也很少使用。

回顾一下此前讲的 RESTful 架构的基本概念,客户端使用 URL 访问资源,通过 HTTP 请求的动词表达对资源的操作。django-rest-framework 针对各种类型的资源操作,提供了对应的通用类视图,这些通用类视图主要包括:

CreateAPIView

用于创建资源的 POST 请求。

ListAPIView 和 RetrieveAPIView

用于访问资源列表和单个资源的 GET 请求。

DestroyAPIView

用于删除资源的 DELETE 请求。

UpdateAPIView

用于更新资源的 PUT(全量更新)和 PATCH(部分更新)请求。

以及以上视图的各种组合通用类视图:ListCreateAPIView、RetrieveUpdateAPIView、RetrieveDestroyAPIView、RetrieveUpdateDestroyAPIView。

博客首页 API 返回首页文章列表数据,显然应该选用的是 ListAPIView。其代码如下:

from rest_framework.generics import ListAPIView

from rest_framework.pagination import PageNumberPagination

from rest_framework.permissions import AllowAny

class IndexPostListAPIView(ListAPIView):

serializer_class = PostListSerializer

queryset = Post.objects.all()

pagination_class = PageNumberPagination

permission_classes = [AllowAny]

That all!首页 API 就写好了。我们基本没有写任何逻辑代码,只是指定了类视图的几个属性值。因为逻辑基本都是通用的,通用类视图在背后帮我们做了全部工作,我们只要告诉它:用哪个序列化器去做,序列化哪个资源等就可以了。以这里的类视图为例,我们指定了:

使用 PostListSerializer 序列化器(通过 serializer_class 指定);

序列化博客文章(Post)列表(通过 queryset 指定);

对资源列表分页(通过 pagination_class 指定,PageNumberPagination 会自动对资源进行分页,后面的教程会详细介绍分页功能);

允许任何人访问该资源(通过 permission_classes 指定,AllowAny 权限类不对任何访问做拦截,即允许任何人调用这个 API 以访问其资源)。

最后一步就是在 urls.py 中绑定接口,把原来绑定的函数视图改为现在的类视图:

path('api/index/', views.IndexPostListAPIView.as_view())

启动开发服务器,打开浏览器访问 http://127.0.0.1:8000/api/index/,可以看到和上一篇教程中使用函数视图返回的结果是一样的:

{

"count": 201,

"next": "http://127.0.0.1:10000/api/index/?page=2",

"previous": null,

"results": [

{

"id": 1,

"title": "Markdown 与代码高亮测试",

"created_time": "2020-04-23T14:22:36.129383+08:00",

"excerpt": "欢迎使用马克飞象\n@(示例笔记本)[马克飞象|帮助|Markdown]\n马克飞象是一款专为印象笔记(Ever",

"category": {

"id": 6,

"name": "Markdown测试"

},

"author": {

"id": 1,

"username": "admin"

},

"views": 0

}

]

}

而且可以看到,返回的结果进行了分页,next 字段指示了下一页的链接,这样分页访问资源就变的非常方便了。

关注公众号加入交流群

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[第 4 篇:用类视图实现首页 API]http://www.zyiz.net/tech/detail-133603.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面给出一个简单的示例程序。 首先,需要创建一个 Maven 项目,并添加以下依赖: ```xml <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.5</version> </dependency> <!-- Jackson JSON Processor --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.2</version> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> </dependencies> ``` 然后,创建一个 `Product` ,用于表示商品信息: ```java public class Product { private int id; private String name; private double price; // getters and setters } ``` 接着,创建一个 `ProductService` 接口和一个 `ProductServiceImpl` ,用于提供商品数据: ```java public interface ProductService { List<Product> findAll(); } @Service public class ProductServiceImpl implements ProductService { private static final List<Product> products = new ArrayList<>(); static { products.add(new Product(1, "iPhone", 999.99)); products.add(new Product(2, "iPad", 799.99)); products.add(new Product(3, "MacBook", 1299.99)); } @Override public List<Product> findAll() { return products; } } ``` 然后,创建一个 `ProductController` ,用于处理商品列表请求: ```java @Controller public class ProductController { @Autowired private ProductService productService; @GetMapping("/products") public String listProducts(Model model) { List<Product> products = productService.findAll(); model.addAttribute("products", products); return "productList"; } } ``` 这里使用 `@Controller` 注解标记该为控制器,使用 `@Autowired` 注解注入 `ProductService` 对象。 `listProducts` 方法处理 `/products` 请求,调用 `ProductService` 获取商品列表,并将其放入 `Model` 中,然后返回 `productList` 视图。 最后,创建一个 `productList.jsp` 视图,用于展示商品列表: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Product List</title> </head> <body> <h1>Product List</h1> <table> <tr> <th>Id</th> <th>Name</th> <th>Price</th> </tr> <c:forEach items="${products}" var="product"> <tr> <td>${product.id}</td> <td>${product.name}</td> <td>${product.price}</td> </tr> </c:forEach> </table> </body> </html> ``` 这里使用 JSTL 的 `forEach` 标签遍历商品列表,展示每个商品的 id、name 和 price。 最后,在 `web.xml` 中配置 `DispatcherServlet`: ```xml <web-app> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` 创建 `dispatcher-servlet.xml` 配置文件,指定视图解析器和控制器包: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.example.controller" /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> </beans> ``` 现在,运行程序,访问 `http://localhost:8080/products`,即可看到商品列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值