使用Django开发简单接口实现文章增删改查
作者:秦无殇 发布时间:2023-02-12 22:29:37
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 inactive
status = 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 alive
status = 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,Article
admin.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返回的是一个list
title_exist = Article.objects.filter(title=title)
#判断是否存在同名title
if 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.status
return 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)==2
if 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 = title
old_art.content = content
old_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.id
art.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).upwd
if 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错误时的运行结果:
来源:http://www.cnblogs.com/webDepOfQWS/p/10693152.html
猜你喜欢
- 思想:4个数字的排列,加上3个运算符的排列,使用后缀表达式的表现如下:情形一:1,2,3,4,+,-,* => 24*24*4情形二:
- 提起数据库,第一个想到的公司,一般都会是Oracle。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处
- Yolov5如何更换BiFPN?第一步:修改common.py将如下代码添加到common.py文件中# BiFPN # 两个特征图add操
- 即使在urlencode之前str.decode(“cp936″).encode(“utf-8″)做了编码转换也是没用的。后来查询手册查到一
- 本文实例讲述了Python实现向服务器请求压缩数据及解压缩数据的方法。分享给大家供大家参考,具体如下:向服务器请求压缩数据格式,并解压缩数据
- 对于字典,通过“键”获得“值”非常简单,但通过“值”获得“键”则需绕些弯子。一、通用:自行定义函数方式假设:输入:一个字典(dic)+要找的
- 如果有一个字符串 eg: "sun,star,moon,clouds",想要在MS SQL中根据给定的分隔符',
- 1、冒泡排序法让列表中的一项和下一项作比较,若前一项大于后一项则交换两者位置(升序)。方法一:直接使用for循环L=[8,2,50,3]fo
- 该sql如下:Select /*+ parallel(src, 8) */ distinct src.systemn
- 就服务器端处理而言,ASP是产生动态Web网页的一种相对较新的技术。动态页意味着什么呢?先暂时不考虑客户端相关功能上的进展,也不讨论客户端脚
- 痛点在传统的工作中,发送会议纪要是一个比较繁琐的任务,需要手动输入邮件内容、收件人、抄送人等信息,每次发送都需要重复操作,不仅费时费力,而且
- 目录使用软件问题描述搭建神经网络训练参数损失函数参数优化代码数据集参数训练测试结语Hello,兄弟们,开始搞深度学习了,今天出第一篇博客,小
- 看youa的源码发现的,原来flash可以有fallback content:<object type="applicati
- Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c++有很大的不同(传统的c/c++使用花括号{}符
- scrapy框架只能爬取静态网站。如需爬取 * 站,需要结合着selenium进行js的渲染,才能获取到动态加载的数据。如何通过seleni
- 这段时间常给来面试的同学用《 你是一个职业的页面重构工作者吗? 》中三个部分的不同阶段去做自测,发现很多人都自我感觉良好,给我的回答基本都是
- 1.1 简介深层神经网络一般都需要大量的训练数据才能获得比较理想的结果。在数据量有限的情况下,可以通过数据增强(Data Augmentat
- 此文章主要向大家描述的是MySQL高级查询方法之记录查询的实际操作步骤,以及对其实际操作过程中要用到的代码的详细描述,以下就是文章的主要内容
- PayPal支付功能其实一直在更新文档和接口,这里说的是一个简单的支付功能大概流程如下1,在网站的结账页面,设置一个提交到PayPal网站的
- 无限分类是实际开发中经常用到的一种数据结构,一般我们称之为树形结构。题设:类似淘宝的商品分类,可以在任意分类设置其子类。 一、创建