使用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中的变量及其命名和打印
Mar 11 Python
python实现unicode转中文及转换默认编码的方法
Apr 29 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
python list转置和前后反转的例子
Aug 26 Python
python在不同条件下的输入与输出
Feb 13 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
python小白切忌乱用表达式
May 29 Python
django使用graphql的实例
Sep 02 Python
快速一键生成Python爬虫请求头
Mar 04 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
使用无限生命期Session的方法
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
纯javascript版日历控件
2016/11/24 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
汇科协同Java笔试题
2012/03/31 面试题
幼儿园大班评语大全
2014/04/17 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
详解Redis实现限流的三种方式
2021/04/27 Redis
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫