使用Django开发简单接口:文章增删改查
目录
- 1、一些准备工作
- 安装django
- 创建django项目
- 创建博客应用(app)
- 2、models.py
- 3、django admin
- 登录
- 创建超级用户
- 4、修改urls.py
- 5、新增文章接口
- 6、查询文章接口
- 7、修改文章接口
- 8、删除文章接口
- 9、鉴权
- 鉴权接口
- 用户认证
1、一些准备工作
安装django
pip install django
创建django项目
进入项目代码存放目录执行命令:
django-admin.py startproject blog_demo
进入blog_demo,运行命令:
python3.6 manage.py runserver 9000
在浏览器地址栏打开:http://127.0.0.1:9000/ 如果出现以下画面,则说明服务器正在运行
创建博客应用(app)
django中每一个app可以看作是一个模块,以app为单位,结构清晰,方便管理。
python3.6 manage.py startapp blog_api
使用开发工具打开项目blog_demo,其结构如下:
2、models.py
编写模型层代码,以下语句相当于创建了两张表:User,Article
class User(models.Model):id = models.AutoField(primary_key=True)uname = models.CharField(max_length=50)upwd = models.CharField(max_length=100)#active inactivestatus = models.CharField(max_length=10)class Article(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=50)content = models.TextField()#deleted alivestatus = models.CharField(max_length=10)
创建表结构:
python3.6 manage.py migrate
settings.py文件INSTALLED_APPS处新增app:blog_api
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','blog_api'
]
让django知道模型有了变化:
python3.6 manage.py makemigrations blog_api
再次创建表结构:
python3.6 manage.py migrate
3、django admin
登录
在浏览器控制台输入:http://127.0.0.1:9000/admin/login/?next=/admin/
创建超级用户
stephen@stephen-K55VD:~/IdeaProjects/blog_demo$ python3.6 manage.py createsuperuser
Username (leave blank to use 'stephen'): admin
Email address:
Password:
Password (again):
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
邮件地址可以不填,注册成功后即可登录。使用admin后台来管理模型需要先注册,修改blog_api/admin.py代码
#导入模型User,Article
from blog_api.models import User,Articleadmin.site.register(User)
admin.site.register(Article)
刷新admin后台,就可以看到刚刚注册的模型了。
4、修改urls.py
from blog_api.views import add_article,modify_article
urlpatterns = [path('admin/', admin.site.urls),path('articles/',add_article),path('articles/<int:art_id>',modify_article)
]
5、新增文章接口
from django.http import HttpResponse,JsonResponse
from blog_api.models import User,Article
import json#新增文章
def add_article(request):if request.method == "POST":req = json.loads(request.body)print (req)key_flag = req.get("title") and req.get("content") and len(req)==2#判断请求体是否正确if key_flag:title = req["title"]content = req["content"]#title返回的是一个listtitle_exist = Article.objects.filter(title=title)#判断是否存在同名titleif len(title_exist) != 0:return JsonResponse({"status":"BS.400","msg":"title aleady exist,fail to publish."})'''插入数据'''add_art = Article(title=title,content=content,status="alive")add_art.save()return JsonResponse({"status":"BS.200","msg":"publish article sucess."})else:return JsonResponse({"status":"BS.400","message":"please check param."})
使用postman工具调用接口,运行结果:
6、查询文章接口
#查询所有文章和状态if request.method == "GET":articles = {}query_art = Article.objects.all()for title in query_art:articles[title.title] = title.statusreturn JsonResponse({"status":"BS.200","all_titles":articles,"msg":"query articles sucess."})
运行结果:
7、修改文章接口
#修改文章
def modify_article(request,art_id):if request.method == "POST":req = json.loads(request.body)try:art = Article.objects.get(id=art_id)key_flag = req.get("title") and req.get("content") and len(req)==2if key_flag:title = req["title"]content = req["content"]title_exist = Article.objects.filter(title=title)if len(title_exist) > 1:return JsonResponse({"status":"BS.400","msg":"title aleady exist."})'''更新数据'''old_art = Article.objects.get(id=art_id)old_art.title = titleold_art.content = contentold_art.save()return JsonResponse({"status":"BS.200","msg":"modify article sucess."})except Article.DoesNotExist:return JsonResponse({"status":"BS.300","msg":"article is not exists,fail to modify."})
运行结果:
8、删除文章接口
#删除文章if request.method == "DELETE":try:art = Article.objects.get(id=art_id)art_id = art.idart.delete()return JsonResponse({"status":"BS.200","msg":"delete article sucess."})except Article.DoesNotExist:return JsonResponse({"status":"BS.300","msg":"article is not exists,fail to delete."})
运行结果:
9、鉴权
四个简单的接口已经可以运行了,但是在发请求之前没有进行鉴权,毫无安全性可言。下面来实现简单的认证机制。需要用到内建模块hashlib,hashlib提供了常见的摘要算法,如MD5,SHA1等。
鉴权接口
新增一个专门用于鉴权的接口。在urls.py中添加
path("auth/",get_token)
在views.py前面新增函数get_token(request)
import hashlib#获取token
def get_token(request):req = json.loads(request.body)uname = req["username"]upwd = req["password"]if request.method == "POST":try:tmppwd =User.objects.get(uname=uname).upwdif upwd == tmppwd:md5 = hashlib.md5()#把密码变成一个长度固定的字符串md5.update(upwd.encode("utf-8"))return JsonResponse({"status":"BS.201","X-Token":md5.hexdigest()})else:return JsonResponse({"status":"BS.401","msg":"username or password may wrong."})except User.DoesNotExist:return JsonResponse({"status":"BS.500","msg":"username is not exist."})
登录django admin在blog_api下的User表新增一条记录。运行结果:
用户认证
request.META.get(“header key”) 用于获取header的信息。注意的是header key必须增加前缀HTTP,同时大写,中划先会转成下划线,例如你的key为X-Token,那么应该写成request.META.get("HTTP_X_TOKEN"),修改views.py在get_token后面加上如下代码:
#认证动作
def user_auth(request):token = request.META.get("HTTP_X_TOKEN",b'')print (token)if token:#暂时先写上auth接口返回的数据if token=="0a6db4e59c7fff2b2b94a297e2e5632e":return "auth_sucess"else:return "auth_fail"else:return "auth_fail"
在接口中调用user_auth函数,以发布文章接口为例:
#新增文章
def add_article(request):auth_res = user_auth(request)if auth_res == "auth_fail":return JsonResponse({"status":"BS.401","msg":"user auth failed."})else:if request.method == "POST":req = json.loads(request.body)print (req).......
再次使用postman工具调用新增文章接口,Header中没有X-Token或X-Token错误时的运行结果:
转载于:https://www.cnblogs.com/webDepOfQWS/p/10693152.html
使用Django开发简单接口:文章增删改查相关推荐
- resultset mysql_MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ [正文] 一.ResultSet接口的介绍: 对数据库的查询操作,一般需要返回查询结果,在程序中,JDBC为我们提供了ResultSet接口来专门处理查 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Mybatis实现简单的数据库增删改查操作
简介: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Ma ...
- java增删改查实例源码_Spring Data JPA 实现简单的CRUD增删改查源码案例
Spring专题 Spring Data JPA 实现简单的CRUD增删改查源码案例 Spring Data JPA旨在简化JPA基础知识库构建和减少需要与数据库进行通信的代码量.第一部分是如何配置H ...
- Django实现对数据库数据增删改查(二)
目录 1.基本框架 1.1.路由分发 1.2.视图函数-逻辑处理 1.3.模板 2.查询功能 2.1.视图函数 2.2.模板函数 3.添加功能 3.1.路由分发 3.2视图函数 3.3.模板 4.编辑 ...
- javaweb简单的登录增删改查系统_利用python操作小程序云数据库实现简单的增删改查!
不止python,你可以利用任何语言那实现通过http请求来操作你自己的小程序云数据库了 背景 也是在最近吧,小程序更新了云开发 HTTP API 文档,提供了小程序外访问云开发资源的能力,使用 HT ...
- .net Api 接口调用 增删改查
.net Api项目搭建内容以前已经说过了,文章链接,这篇文章在已经搭建好项目基础上简单说下如何建立API增删改查接口. 在Models中建立一个实体类: namespace ApiTest.Mode ...
- jqGrid+FastJson+MybatisPlus快速开发分页排序和增删改查。
框架介绍 jqGrid :是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信.支持json和xml数据和服务器交互,有很多自定义的功能,具体可以去看文档:http://blog ...
- javaweb简单的登录增删改查系统_国产化之路统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作...
引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...
- Django中数据对象的增删改查常用方法,自定义管理器类,过滤器及F和Q对象等知识点总结
Django对象的增删改查 我们为了对django对象的增删改查进行总结,先在model.py文件中创建类便于举例 定义学生: class Students(models.Model):sname=m ...
最新文章
- VMware14安装CentOS7的详细教程
- python画指数函数图像_解决python中的幂函数、指数函数问题
- ubuntu下解决Ruby安装后缺少openssl的问题
- Maple Warrior 个人简历
- 数学之美:“植物身上的黄金分割”
- Xcode Git 使用
- 《高级软件测试》实践作业4学习记录12月25日
- Mysql - 安装与配置
- 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。...
- mysql cmd 删除表_MySQL查看表和清空表的常用命令总结
- java数据校验博客_springmvc教程:利用Validation进行参数校验
- flash特效原理:图片滑动放大效果(3)
- 【深入理解Nginx】Nginx的配置
- c语言教师工资管理系统源程序设计,C语言教师工资管理系统
- 阿里云平台购买域名 备案步骤
- 互联网应用基础第五课:互联网即时通讯工具之QQ和微信的使用、淘宝客理解
- 计算机网络安全实训课程,计算机网络安全课程实验教学实践研究
- 程序猿打新总结 6月份 新股申购秘籍
- AGV自动导航控制系统
- xlsx VLOOKUP 怎么用
热门文章
- 仿MIUI音量变化环形进度条实现
- 【转载】C++ ,C#数据类型对照
- 【java】接口(interface)
- 持续交付模型中文化转型的重要意义
- 主键思维定势导致的惨案
- 内存分配知识:全局,局部,静态变量
- “非IE内核浏览器”第一阶段开发计划发布
- oracle 删除已备份归档,通过RMAN联机全库备份,包括控制文件,归档日志文件,备份成功后,删除已备份的归档日志。...
- element ui 分页增删改查_【新插件发布】AzureAD运维Excel版插件,增删改查快10倍c以上!...
- java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?