Django中REST风格数据传输

来源:互联网 发布:淘宝客服怎么认证 编辑:程序博客网 时间:2024/05/20 07:32

在《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.pyfrom django.conf.urls import url, includefrom lists import views as list_viewsfrom lists import urls as list_urlsurlpatterns = [    url(r'^$', list_views.home_page, name='home'),    url(r'^lists/', include(list_urls)),]
lists/url.pyfrom django.conf.urls import urlfrom lists import viewsurlpatterns = [    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.pyfrom django.db import modelsclass List(models.Model):    passclass Item(models.Model):    text = models.TextField(default='')    list = models.ForeignKey(List, default=None)
views.pyfrom django.shortcuts import render, redirectfrom django.http import HttpResponsefrom 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}/')
原创粉丝点击