Django实战:从零构建文章增删改查接口并实现基础鉴权
本文详细讲解如何使用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的文章增删改查接口开发及基础鉴权功能的实现,希望本文内容能对您的学习有所帮助,欢迎继续支持本站获取更多技术分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









