使用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 相关文章推荐
python3制作捧腹网段子页爬虫
Feb 12 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
django允许外部访问的实例讲解
May 14 Python
python smtplib模块实现发送邮件带附件sendmail
May 22 Python
Python之list对应元素求和的方法
Jun 28 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
python频繁写入文件时提速的方法
Jun 26 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
Python日志syslog使用原理详解
Feb 18 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
python上selenium的弹框操作实现
Jul 13 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去除重复字的实现代码
2011/09/16 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
python paramiko模块学习分享
2017/08/23 Python
利用python画出折线图
2018/07/26 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
pandas数据处理之绘图的实现
2020/06/15 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
2014年财务科工作总结
2014/11/11 职场文书
琅琊山导游词
2015/02/05 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
超市员工管理制度
2015/08/06 职场文书
如何书写授权委托书?
2019/06/25 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫