学习笔记 :RESTFUL 资源的请求方法

RESTFUL

RESTFUL 是一种编程风格

URL 统一资源标识

学生管理系统中的学生 学生就是资源

图书管理系统中的书 书就是资源

增加请求方法
不使用restful 对资源的请求方法(资源的接口)
http://127.0.0.1/delete/2/  POST请求
http://127.0.0.1/book_list/ GET请求
http://127.0.0.1/book/2/    GET请求
http://127.0.0.1/update/2/  POST请求
http://127.0.0.1/add/       POST请求
 
使用restful 对资源的请求方法(资源的接口)
总的资源  http://127.0.0.1/book/ POST请求 (增加一本书)
					   		   GET请求  获得所有书  

一本书    http://127.0.0.1/book/2/  DELETE请求  删除
						          GET请求  获得一本书
						          PUT请求  修改
若浏览器 客户端不支持 PUT DELETE 怎么处理
在前端页面中增加一个隐藏参数 如   _method="DELETE"{% csrf_token %}  用法相同

创建项目 django-admin startproject RESTfulDemo
创建app  django-admin startapp app

settings.py

ALLOWED_HOSTS = ['10.8.152.31']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
    'book',
]






restfuldemo/urls.py

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include('app.urls'))
]




app/urls.py  两种写法
第一种

from django.conf.urls import url
from app.views import home

urlpatterns = [
    url(r'^$',home)  # ^$默认首页
]


第二种
# from django.conf.urls import url
# from app import views
#
# urlpatterns = [
#     url(r'^$',views.home)  # ^$默认首页
# ]




app/views.py
from django.shortcuts import render
from django.http import JsonResponse

# Create your views here.

#REST  API (JSON 格式的接口数据)

def home(request):
    if request.method == 'GET':
        return JsonResponse({'method':'GET'})

    elif request.method == 'POST':
        return JsonResponse({'method':'POST'})

    elif request.method == 'PUT':
        #修改资源
        return JsonResponse({'method':'PUT'})

    elif request.method == 'DELETE':
        #删除指定资源
        return JsonResponse({'method':'DELETE'})

    return render(request,template_name='index.html')




templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2>hello</h2>

</body>
</html>


测试 

二级分类

创建项目 django-admin startproject RESTfulDemo
创建app  django-admin startapp app 
创建app  django-admin startapp book


book/models.py

from django.db import models
from datetime import datetime
# Create your models here.
#书籍分类 和图书 是一对多的关系

#书籍分类
class BookCategory(models.Model):
    CATEGORY_TYPE = [
        (1,'一级类目'),
        (2,'二级类目'),
    ]
 # 类目名
    name = models.CharField('类目名',max_length=50)

    # 类目code 代号
    code = models.CharField('类目code',max_length=50)

    # 类目的描述
    description = models.TextField('类目描述',default='')

    # 类目的级别
    category_type = models.IntegerField('类目级别',choices=CATEGORY_TYPE)

    # 是否在首页类别导航中显示
    is_nav = models.BooleanField('导航中显示',default=False)

    # 是否有父级分类  父级类目
    # self 表示对象自身
    parent_category = models.ForeignKey('self',on_delete=models.CASCADE,
                                        null=True,blank=True,
                                        verbose_name='父级类目',
                                        related_name='sub_category')
		    
     #有关系的字段 如包含 ForeignKey 或者MangToMang 的这些字段  要明确指出别名     #verbose_name      related_name两者关系的命名
      
        
        # Meta中可以添加附加信息
        class Meta:
        #当前模型的别名
        verbose_name = "图书类型"
        #当前模型的别名的复数形式
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.name
    
 #在创建多对一的关系的,需要在Foreign的第二参数中加入on_delete=models.CASCADE  主外关系键中,级联删除,也就是当删除主表的数据时候从表中的数据也随着一起删除


# 图书
class Book(models.Model):
    #图书名
    name = models.CharField(max_length=100)
    
    #价格 FloatField价格可能是小数
    price = models.FloatField()
    
    #分类
    category=models.ForeignKey(BookCategory,
                               on_delete=models.CASCADE,
                               verbose_name='图书类别')
    #封面
    cover=models.ImageField(upload_to='/books/images/',
                            null=True,
                            blank=True,
                            verbose_name='图书封面')

    #库存
    inventory = models.IntegerField('库存数',default=0)
    
    #是否是新书
    is_new = models.BooleanField('是否是新书',default=False)
    #是否是热门推荐
    is_hot = models.BooleanField('是否是热门图书',default=False)
    #图书添加时间
    add_time = models.DateTimeField('添加图书时间',default=datetime.now)

    class Meta:
        verbose_name = '图书信息'
        verbose_name_plural = '所有图书'

    def __str__(self):
        return self.name

执行:
python manage.py makemigrations
python manage.py migrate



在book中创建一个工具包 database_help 帮助我们往数据库中插入数据 
在database_help 下创建一个data    data中创建一个 图书分类 book_category.py

在data下创建一个 import_category_to_database.py 把数据导入到数据库



				    |———data ————book_category.py
book—— database_help  |
					|———import_category_to_database.py
    
 

book_category.py
#定义一个变量 书籍分类
book_category = [
    #一级分类,儿童图书

    {
        'code':'ETWX',  #类目code 编码
        'name':'儿童图书', #类目名称

    #二级分类  中国儿童文学 外国儿童文学  少儿英语
        'sub_category':[
            {
                'code':'ZGETWX',
                'name':'中国儿童文学'
            },

            {
                'code':'WGETWX',
                'name':'外国儿童文学'
            },
            {
                'code':'SEYY',
                'name':'少儿英语'
            },

        ]
    },



    #一级分类,励志  图书
    {
        'code':'LZ',
        'name':'励志',
    #二级分类 励志成功 心灵修养
        'sub_category':[

            {
                'code':'LZCG',
                'name':'励志成功'},
            {
                'code':'XLXY',
                'name':'心灵修养'},

        ]
    },

]

#把字典转化为json数据

import json
#json.dumps(book_category)

#测试
print(json.dumps(book_category))
结果
[{"name": "\u513f\u7ae5\u56fe\u4e66", "code": "ETWX", "sub_category": [{"name": "\u4e2d\u56fd\u513f\u7ae5\u6587\u5b66", "code": "ZGETWX"}, {"name": "\u5916\u56fd\u513f\u7ae5\u6587\u5b66", "code": "WGETWX"}, {"name": "\u5c11\u513f\u82f1\u8bed", "code": "SEYY"}]}, {"name": "\u52b1\u5fd7", "code": "LZ", "sub_category": [{"name": "\u52b1\u5fd7\u6210\u529f", "code": "LZCG"}, {"name": "\u5fc3\u7075\u4fee\u517b", "code": "XLXY"}]}]






注意:
 #os.path和 sys.path
 #__file__    #是用来获得模块所在的路径的
 #os.path.dirname()  返回目录路径
 os.path 是一个模块,用来处理目录、路径相关的模块。 
sys.path 是一个列表,返回解释器相关的目录列表、环境变量、注册表等初始化 
信息 

sys.path —— 动态地改变Python搜索路径
如果python中导入的package或module不在环境变量PATH中,那么可以使用sys.path将要导入的package或module加入到PATH环境变量中。
sys.path.append('引用模块的地址')   
sys.path.insert(0, '引用模块的地址')  




把数据插入到数据库
import_category_to_database.py


import os
import sys
BASE_DIR =os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
#print(BASE_DIR )  打印结果C:\Users\Administrator\Desktop\RESTfulDemo-9.1
 
#print(sys.path) 未添加时的结果
['C:\\Users\\Administrator\\Desktop\\RESTfulDemo-9.1\\book\\database_help', 'C:\\Users\\Administrator\\Desktop\\RESTfulDemo-9.1', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv\\Scripts\\python35.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv\\lib\\site-packages', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.5.egg']


#print(sys.path) 添加之后的结果
['C:\\Users\\Administrator\\Desktop\\RESTfulDemo-9.1\\book\\database_help', 'C:\\Users\\Administrator\\Desktop\\RESTfulDemo-9.1', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv\\Scripts\\python35.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv\\lib\\site-packages', 'C:\\Users\\Administrator\\PycharmProjects\\02-xuni\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.5.egg', 'C:\\Users\\Administrator\\Desktop\\RESTfulDemo-9.1'] #添加到环境变量
把数据插入到数据库
import_category_to_database.py

import os
import sys
BASE_DIR =os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
#添加到环境变量
sys.path.append(BASE_DIR)
 
 

# 设置setting信息  setdefault设置默认值
if __name__ =='__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE","RESTfulDemo.settings")
# 初始化django
import django
django.setup()

# 导入分类数据
from book.database_help.data.book_category import book_category
# 导入模型
from book.models import BookCategory
# 遍历book_category 中的分类,并把分类保存到数据库中

# 一级分类遍历
for lev1 in book_category:
    print(">>>",lev1)
    # 创建一级分类的实例
    lev1_instance =  BookCategory()
    lev1_instance.code = lev1['code']
    lev1_instance.name = lev1['name']
    lev1_instance.category_type=1
    lev1_instance.save()


    for lev2 in lev1['sub_category']:
        print('<<<', lev2)

        # 创建二级分类的实例
        lev2_instance = BookCategory()
        lev2_instance.code = lev2['code']
        lev2_instance.name = lev2['name']
        lev2_instance.category_type = 2
        # 二级分类指定父类
        lev2_instance.parent_category = lev1_instance
        lev2_instance.save()

    
 


  

猜你喜欢

转载自blog.csdn.net/huiyinimen/article/details/83550065