Django中REST风格数据传输

在《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}/')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值