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()