Django实战:从零构建文章增删改查接口并实现基础鉴权

Owen
Owen
发布时间:2026-10-13 | 6人浏览过
原创

本文详细讲解如何使用Django框架快速搭建博客系统的后端接口。内容涵盖项目初始化、模型层User与Article的定义、Admin后台配置,以及通过Postman实现文章的增、删、改、查功能。重点演示了基于hashlib和MD5的简单Token鉴权机制,包括获取Token、Header解析及接口安全校验,帮助开发者掌握Django基础API开发与基础安全策略。

环境准备与项目初始化

在开始编写代码之前,需要确保开发环境已准备好必要的依赖库和基础配置。

首先需要安装Django框架,这是构建Web应用的核心基础。


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被视为一个独立的功能模块,这种结构有助于保持代码清晰且易于维护。


python3.6 manage.py startapp blog_api

使用代码编辑器打开blog_demo项目,其目录结构应包含以下关键文件。

 

模型定义与数据库迁移

模型层(models.py)负责定义数据表结构,以下是创建User和Article两张核心表的代码示例。

定义模型类时,以下代码逻辑对应数据库中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列表中注册新创建的blog_api应用,以便Django识别。


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

Admin后台配置与管理

Django Admin后台提供了可视化的数据管理界面,便于快速测试和调试。

首先需要通过特定URL访问Admin登录页面。

在浏览器控制台或地址栏输入http://127.0.0.1:9000/admin/login/?next=/admin/以访问登录界面。

 

为了登录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后台页面,即可看到刚才注册的User和Article模型,表明注册成功。

 

接口开发与功能实现

接下来需要配置URL路由,将具体的视图函数映射到对应的URL路径。


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)
]

在urls.py文件中添加相应的路径配置,以指向具体的处理函数。


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工具发送POST请求调用新增文章接口,观察返回结果。

 

实现查询所有文章及其状态的接口,通过GET请求获取数据。


#查询所有文章和状态
  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."})

使用Postman执行查询操作,查看返回的文章列表数据。

 

实现修改已有文章内容的接口,支持通过ID定位并更新数据。


#修改文章
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."})

使用Postman发送修改请求,验证接口是否成功更新文章信息。

 

实现删除文章的接口,通过DELETE请求移除指定ID的文章记录。


#删除文章
  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."})

使用Postman执行删除操作,确认文章是否被成功移除。

 

安全鉴权机制实现

上述四个接口虽能运行,但缺乏安全性,未进行身份验证。接下来将引入简单的认证机制以提升安全性。

为了实现鉴权,需要利用Python内建的hashlib模块,该模块提供了MD5、SHA1等常见的摘要算法。

新增一个专门用于生成和验证Token的鉴权接口,以支持后续的业务接口调用。

在urls.py文件中添加auth路径,指向新创建的鉴权视图函数。


 path("auth/",get_token)

在views.py文件中新增get_token函数,用于处理Token的生成逻辑。


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后台的User表中添加一条用户记录,然后调用鉴权接口,观察返回的Token结果。

 

在业务接口中实现用户认证逻辑,确保只有合法用户才能执行操作。

通过request.META.get("header key")方法获取HTTP请求头信息。需注意,Header Key必须添加HTTP前缀并转换为大写,连字符转为下划线,例如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或Token值错误,将看到相应的错误返回结果。

至此,完成了基于Django的文章增删改查接口开发及基础鉴权功能的实现,希望本文内容能对您的学习有所帮助,欢迎继续支持本站获取更多技术分享。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表