经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
使用Django开发简单接口实现文章增删改查
来源:jb51  时间:2019/5/10 8:38:45  对本文有异议

1、一些准备工作

 安装django

  1. pip install django

创建django项目

进入项目代码存放目录执行命令:

  1. django-admin.py startproject blog_demo

进入blog_demo,运行命令:

  1. python3.6 manage.py runserver 9000

在浏览器地址栏打开:http://127.0.0.1:9000/ 如果出现以下画面,则说明服务器正在运行

 

创建博客应用(app)

django中每一个app可以看作是一个模块,以app为单位,结构清晰,方便管理。

  1. python3.6 manage.py startapp blog_api

使用开发工具打开项目blog_demo,其结构如下:

 

2、models.py

编写模型层代码,以下语句相当于创建了两张表:User,Article

  1. class User(models.Model):
  2. id = models.AutoField(primary_key=True)
  3. uname = models.CharField(max_length=50)
  4. upwd = models.CharField(max_length=100)
  5. #active inactive
  6. status = models.CharField(max_length=10)
  7.  
  8. class Article(models.Model):
  9. id = models.AutoField(primary_key=True)
  10. title = models.CharField(max_length=50)
  11. content = models.TextField()
  12. #deleted alive
  13. status = models.CharField(max_length=10)

创建表结构:

  1. python3.6 manage.py migrate

settings.py文件INSTALLED_APPS处新增app:blog_api

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'blog_api'
  9. ]

让django知道模型有了变化:

  1. python3.6 manage.py makemigrations blog_api

再次创建表结构:

  1. python3.6 manage.py migrate

3、django admin

 登录

在浏览器控制台输入:http://127.0.0.1:9000/admin/login/?next=/admin/

 

创建超级用户

  1. stephen@stephen-K55VD:~/IdeaProjects/blog_demo$ python3.6 manage.py createsuperuser
  2. Username (leave blank to use 'stephen'): admin
  3. Email address:
  4. Password:
  5. Password (again):
  6. This password is too common.
  7. Bypass password validation and create user anyway? [y/N]: y
  8. Superuser created successfully.

邮件地址可以不填,注册成功后即可登录。使用admin后台来管理模型需要先注册,修改blog_api/admin.py代码

  1. #导入模型User,Article
  2. from blog_api.models import User,Article
  3.  
  4. admin.site.register(User)
  5. admin.site.register(Article)

刷新admin后台,就可以看到刚刚注册的模型了。

 

4、修改urls.py

  1. from blog_api.views import add_article,modify_article
  2. urlpatterns = [
  3. path('admin/', admin.site.urls),
  4. path('articles/',add_article),
  5. path('articles/<int:art_id>',modify_article)
  6. ]

5、新增文章接口

  1. from django.http import HttpResponse,JsonResponse
  2. from blog_api.models import User,Article
  3. import json
  4.  
  5. #新增文章
  6. def add_article(request):
  7. if request.method == "POST":
  8. req = json.loads(request.body)
  9. print (req)
  10. key_flag = req.get("title") and req.get("content") and len(req)==2
  11. #判断请求体是否正确
  12. if key_flag:
  13. title = req["title"]
  14. content = req["content"]
  15. #title返回的是一个list
  16. title_exist = Article.objects.filter(title=title)
  17. #判断是否存在同名title
  18. if len(title_exist) != 0:
  19. return JsonResponse({"status":"BS.400","msg":"title aleady exist,fail to publish."})
  20.  
  21. '''插入数据'''
  22. add_art = Article(title=title,content=content,status="alive")
  23. add_art.save()
  24. return JsonResponse({"status":"BS.200","msg":"publish article sucess."})
  25. else:
  26. return JsonResponse({"status":"BS.400","message":"please check param."})

使用postman工具调用接口,运行结果:

 

6、查询文章接口

  1. #查询所有文章和状态
  2. if request.method == "GET":
  3. articles = {}
  4. query_art = Article.objects.all()
  5. for title in query_art:
  6. articles[title.title] = title.status
  7. return JsonResponse({"status":"BS.200","all_titles":articles,"msg":"query articles sucess."})

运行结果:

 

7、修改文章接口

  1. #修改文章
  2. def modify_article(request,art_id):
  3. if request.method == "POST":
  4. req = json.loads(request.body)
  5. try:
  6. art = Article.objects.get(id=art_id)
  7. key_flag = req.get("title") and req.get("content") and len(req)==2
  8. if key_flag:
  9. title = req["title"]
  10. content = req["content"]
  11. title_exist = Article.objects.filter(title=title)
  12. if len(title_exist) > 1:
  13. return JsonResponse({"status":"BS.400","msg":"title aleady exist."})
  14. '''更新数据'''
  15. old_art = Article.objects.get(id=art_id)
  16. old_art.title = title
  17. old_art.content = content
  18. old_art.save()
  19. return JsonResponse({"status":"BS.200","msg":"modify article sucess."})
  20. except Article.DoesNotExist:
  21. return JsonResponse({"status":"BS.300","msg":"article is not exists,fail to modify."})

运行结果:

 

8、删除文章接口

  1. #删除文章
  2. if request.method == "DELETE":
  3. try:
  4. art = Article.objects.get(id=art_id)
  5. art_id = art.id
  6. art.delete()
  7. return JsonResponse({"status":"BS.200","msg":"delete article sucess."})
  8. except Article.DoesNotExist:
  9. return JsonResponse({"status":"BS.300","msg":"article is not exists,fail to delete."})

运行结果:

 

9、鉴权

四个简单的接口已经可以运行了,但是在发请求之前没有进行鉴权,毫无安全性可言。下面来实现简单的认证机制。需要用到内建模块hashlib,hashlib提供了常见的摘要算法,如MD5,SHA1等。

鉴权接口

新增一个专门用于鉴权的接口。在urls.py中添加

  1. path("auth/",get_token)

在views.py前面新增函数get_token(request)

  1. import hashlib
  2.  
  3. #获取token
  4. def get_token(request):
  5. req = json.loads(request.body)
  6. uname = req["username"]
  7. upwd = req["password"]
  8. if request.method == "POST":
  9. try:
  10. tmppwd =User.objects.get(uname=uname).upwd
  11. if upwd == tmppwd:
  12. md5 = hashlib.md5()
  13. #把密码变成一个长度固定的字符串
  14. md5.update(upwd.encode("utf-8"))
  15. return JsonResponse({"status":"BS.201","X-Token":md5.hexdigest()})
  16. else:
  17. return JsonResponse({"status":"BS.401","msg":"username or password may wrong."})
  18.  
  19. except User.DoesNotExist:
  20. return JsonResponse({"status":"BS.500","msg":"username is not exist."})

登录django admin在blog_api下的User表新增一条记录。运行结果:

 

用户认证

request.META.get(“header key”) 用于获取header的信息。注意的是header key必须增加前缀HTTP,同时大写,中划先会转成下划线,例如你的key为X-Token,那么应该写成request.META.get("HTTP_X_TOKEN"),修改views.py在get_token后面加上如下代码:

  1. #认证动作
  2. def user_auth(request):
  3.  
  4. token = request.META.get("HTTP_X_TOKEN",b'')
  5. print (token)
  6. if token:
  7. #暂时先写上auth接口返回的数据
  8. if token=="0a6db4e59c7fff2b2b94a297e2e5632e":
  9. return "auth_sucess"
  10. else:
  11. return "auth_fail"
  12. else:
  13. return "auth_fail"

在接口中调用user_auth函数,以发布文章接口为例:

  1. #新增文章
  2. def add_article(request):
  3. auth_res = user_auth(request)
  4. if auth_res == "auth_fail":
  5. return JsonResponse({"status":"BS.401","msg":"user auth failed."})
  6. else:
  7. if request.method == "POST":
  8. req = json.loads(request.body)
  9. print (req)
  10. .......

再次使用postman工具调用新增文章接口,Header中没有X-Token或X-Token错误时的运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号