使用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求列表交集的方法汇总
Nov 10 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
Python中的面向对象编程详解(上)
Apr 13 Python
Python实现简单过滤文本段的方法
May 24 Python
django实现用户登陆功能详解
Dec 11 Python
matplotlib中legend位置调整解析
Dec 19 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
Python实现Restful API的例子
Aug 31 Python
Python List列表对象内置方法实例详解
Oct 22 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
python的变量和简单数字类型详解
Sep 15 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
PHP Google的translate API代码
2008/12/10 PHP
php中Smarty模板初体验
2011/08/08 PHP
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
django1.11.1 models 数据库同步方法
2018/05/30 Python
解读python如何实现决策树算法
2018/10/11 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
python实现LRU热点缓存及原理
2019/10/29 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
传播学专业毕业生自荐信
2013/11/04 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
优秀教师获奖感言
2014/01/31 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
纪律教育月活动总结
2014/08/26 职场文书
立春观后感
2015/06/18 职场文书
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
Nginx 匹配方式
2022/05/15 Servers