Django中REST风格数据传输

时间:2021-05-11 19:20:57

在《Python Web开发:测试驱动方法》一书中的第七章,主要讲解了如何利用url的方式进行数据的传递和存储。

本书主要采用了先测试、后创建功能的方式进行书写,基本上所有的内容都是通过功能测试、单元测试和实现功能三个步骤的循环工作。这种方法让我们能够深刻地理解TDD这一基本思想,但并不利于Django框架的基本学习,所以我将前端html页面、视图层views.py和模型层models.py单独摘出来,帮自己梳理一下思路。

模板层

到本书的第七章,建立了两个html文件,分别是主页的home.html和用于不同用户记录和传输数据的list.html。

看过这本书的读者可以知道,在这一章,list.html是copy自home.html,之后删除了home中的table部分。home.html的主要功能是在form元素中添加method="POST" action="/lists/new" 这两个属性,当用户在输入框中输入数据后,以POST的方式,传输到新的url/lists/new

同理,list.html的form 的action属性被设置为/lists/{{ list.id }}/add_item, 跳转到了新的页面。

home.html
<!DOCTYPE html>
<html>
<head>
<title>To-Do lists</title>
</head>
<body>
<h1>Start a new To-Do list</h1>
<form method="POST" action="/lists/new">
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/>
{% csrf_token %}
</form>


</body>
</html>
list.html
<!DOCTYPE html>
<html>
<head>
<title>To-Do lists</title>
</head>
<body>
<h1>Your To-Do list</h1>
<form method="POST" action="/lists/
{{ list.id }}/add_item">
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/>
{% csrf_token %}
</form>

<table id="id_list_table">
{% for item in list.item_set.all%}
<tr><td>
{{forloop.counter}}: {{ item.text }}</td></tr>
{% endfor %}
</table>

</body>
</html>

urls.py

个人理解,Django的urls.py文件就是一个映射表,可以将url与视图层的功能方法对应起来,换句话说,它就是一个url请求映射表。

Django建议开发者将项目的总urls文件与各个应用的文件分开存储,所以本文建立了superlists/urls.pylists/url.py两个urls.py。

superlists/urls.py

from django.conf.urls import url, include
from lists import views as list_views
from lists import urls as list_urls

urlpatterns = [
url(r'^$', list_views.home_page, name='home'),
url(r'^lists/', include(list_urls)),
]
lists/url.py
from django.conf.urls import url
from lists import views

urlpatterns = [
url(r'^new$', views.new_list, name='new_list'),
url(r'^(\d+)/$', views.view_list, name='view_list'),
url(r'^(\d+)/add_item$', views.add_item, name='add_item'),
]

模型层和视图层

Django并不是严格意义上的MVC模式,即MODEL, VIEW, CONTROLLER。因为它的View层承担了传统的控制层的一部分功能,可以进行数据的操作。
在本文中,通过url的映射,views.py中存在着一一对应的方法。用户从home.html进入网站后,输入数据跳转到list.html中,并执行new_list(request):跳转到持有相关id号的url中,并通过view_list(request, list_id):显示数据。而在list页面中,每次提交则再次触发action="/lists/{{ list.id }}/add_item",将数据添加到数据库中后在此跳转回/lists/{list_.id}/

models.py

from django.db import models

class List(models.Model):
pass


class Item(models.Model):
text = models.TextField(default='')
list = models.ForeignKey(List, default=None)
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse

from lists.models import Item, List

# Create your views here.
def home_page(request):
return render(request, 'home.html')

def view_list(request, list_id):
list_ = List.objects.get(id=list_id)
return render(request, 'list.html', {'list': list_})

def new_list(request):
list_ = List.objects.create()
Item.objects.create(text=request.POST['item_text'], list=list_)
return redirect(f'/lists/{list_.id}/')

def add_item(request, list_id):
list_ = List.objects.get(id=list_id)
Item.objects.create(text=request.POST['item_text'], list=list_)
return redirect(f'/lists/{list_.id}/')