使用Django开发简单接口实现文章增删改查


Posted in Python onMay 09, 2019

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/ 如果出现以下画面,则说明服务器正在运行

使用Django开发简单接口实现文章增删改查 

创建博客应用(app)

django中每一个app可以看作是一个模块,以app为单位,结构清晰,方便管理。

python3.6 manage.py startapp blog_api

使用开发工具打开项目blog_demo,其结构如下:

使用Django开发简单接口实现文章增删改查 

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/

使用Django开发简单接口实现文章增删改查 

创建超级用户

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后台,就可以看到刚刚注册的模型了。

使用Django开发简单接口实现文章增删改查 

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工具调用接口,运行结果:

使用Django开发简单接口实现文章增删改查 

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."})

运行结果:

使用Django开发简单接口实现文章增删改查 

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."})

运行结果:

使用Django开发简单接口实现文章增删改查 

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."})

运行结果:

使用Django开发简单接口实现文章增删改查 

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表新增一条记录。运行结果:

使用Django开发简单接口实现文章增删改查 

用户认证

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错误时的运行结果:

使用Django开发简单接口实现文章增删改查

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现冒泡,插入,选择排序简单实例
Aug 18 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
python3 发送任意文件邮件的实例
Jan 23 Python
Python语言的变量认识及操作方法
Feb 11 Python
python实现拓扑排序的基本教程
Mar 11 Python
python3处理含有中文的url方法
May 10 Python
tensorflow实现简单的卷积神经网络
May 24 Python
Python-openCV读RGB通道图实例
Jan 17 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
Python3交互式shell ipython3安装及使用详解
Jul 11 Python
python excel多行合并的方法
Dec 09 Python
python GUI实现小球满屏乱跑效果
May 09 #Python
深入浅析python 协程与go协程的区别
May 09 #Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 #Python
python3.6使用tkinter实现弹跳小球游戏
May 09 #Python
使用GitHub和Python实现持续部署的方法
May 09 #Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 #Python
Python Excel处理库openpyxl使用详解
May 09 #Python
You might like
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
Django 中 cookie的使用
2017/08/17 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
js同时按下两个方向键
2007/12/01 Javascript
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
javascript定时器完整实例
2015/02/10 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
python实现多线程的两种方式
2016/05/22 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Python grpc超时机制代码示例
2020/09/14 Python
世界上最大的二手相机店:KEN
2017/05/17 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
公务员个人自我评价分享
2013/11/06 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
司机检讨书
2014/02/13 职场文书
党建目标管理责任书
2014/07/25 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
有关西游记的读书笔记
2015/06/25 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python