使用Django開(kāi)發(fā)簡(jiǎn)單接口實(shí)現(xiàn)文章增刪改查
1、一些準(zhǔn)備工作
安裝django
pip install django
創(chuàng)建django項(xiàng)目
進(jìn)入項(xiàng)目代碼存放目錄執(zhí)行命令:
django-admin.py startproject blog_demo
進(jìn)入blog_demo,運(yùn)行命令:
python3.6 manage.py runserver 9000
在瀏覽器地址欄打開(kāi):http://127.0.0.1:9000/ 如果出現(xiàn)以下畫(huà)面,則說(shuō)明服務(wù)器正在運(yùn)行
創(chuàng)建博客應(yīng)用(app)
django中每一個(gè)app可以看作是一個(gè)模塊,以app為單位,結(jié)構(gòu)清晰,方便管理。
python3.6 manage.py startapp blog_api
使用開(kāi)發(fā)工具打開(kāi)項(xiàng)目blog_demo,其結(jié)構(gòu)如下:
2、models.py
編寫(xiě)模型層代碼,以下語(yǔ)句相當(dāng)于創(chuàng)建了兩張表: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)
創(chuàng)建表結(jié)構(gòu):
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
再次創(chuàng)建表結(jié)構(gòu):
python3.6 manage.py migrate
3、django admin
登錄
在瀏覽器控制臺(tái)輸入:http://127.0.0.1:9000/admin/login/?next=/admin/
創(chuàng)建超級(jí)用戶(hù)
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.
郵件地址可以不填,注冊(cè)成功后即可登錄。使用admin后臺(tái)來(lái)管理模型需要先注冊(cè),修改blog_api/admin.py代碼
#導(dǎo)入模型User,Article from blog_api.models import User,Article admin.site.register(User) admin.site.register(Article)
刷新admin后臺(tái),就可以看到剛剛注冊(cè)的模型了。
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 #判斷請(qǐng)求體是否正確 if key_flag: title = req["title"] content = req["content"] #title返回的是一個(gè)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."}) '''插入數(shù)據(jù)''' 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工具調(diào)用接口,運(yùn)行結(jié)果:
6、查詢(xún)文章接口
#查詢(xún)所有文章和狀態(tài) 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."})
運(yùn)行結(jié)果:
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."}) '''更新數(shù)據(jù)''' 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."})
運(yùn)行結(jié)果:
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."})
運(yùn)行結(jié)果:
9、鑒權(quán)
四個(gè)簡(jiǎn)單的接口已經(jīng)可以運(yùn)行了,但是在發(fā)請(qǐng)求之前沒(méi)有進(jìn)行鑒權(quán),毫無(wú)安全性可言。下面來(lái)實(shí)現(xiàn)簡(jiǎn)單的認(rèn)證機(jī)制。需要用到內(nèi)建模塊hashlib,hashlib提供了常見(jiàn)的摘要算法,如MD5,SHA1等。
鑒權(quán)接口
新增一個(gè)專(zhuān)門(mén)用于鑒權(quán)的接口。在urls.py中添加
path("auth/",get_token)
在views.py前面新增函數(shù)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() #把密碼變成一個(gè)長(zhǎng)度固定的字符串 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表新增一條記錄。運(yùn)行結(jié)果:
用戶(hù)認(rèn)證
request.META.get(“header key”) 用于獲取header的信息。注意的是header key必須增加前綴HTTP,同時(shí)大寫(xiě),中劃先會(huì)轉(zhuǎn)成下劃線,例如你的key為X-Token,那么應(yīng)該寫(xiě)成request.META.get("HTTP_X_TOKEN"),修改views.py在get_token后面加上如下代碼:
#認(rèn)證動(dòng)作 def user_auth(request): token = request.META.get("HTTP_X_TOKEN",b'') print (token) if token: #暫時(shí)先寫(xiě)上auth接口返回的數(shù)據(jù) if token=="0a6db4e59c7fff2b2b94a297e2e5632e": return "auth_sucess" else: return "auth_fail" else: return "auth_fail"
在接口中調(diào)用user_auth函數(shù),以發(fā)布文章接口為例:
#新增文章 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工具調(diào)用新增文章接口,Header中沒(méi)有X-Token或X-Token錯(cuò)誤時(shí)的運(yùn)行結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
TensorFlow自定義模型保存加載和分布式訓(xùn)練
本篇文章將涵蓋 TensorFlow 的高級(jí)應(yīng)用,包括如何自定義模型的保存和加載過(guò)程,以及如何進(jìn)行分布式訓(xùn)練,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07python中WSGI是什么,Python應(yīng)用WSGI詳解
這篇文章主要介紹一下python中的WSGI, 小編在網(wǎng)上找了幾篇非常好的關(guān)于WSGI介紹,整理一下分享給大家。2017-11-11對(duì)numpy中的transpose和swapaxes函數(shù)詳解
今天小編就為大家分享一篇對(duì)numpy中的transpose和swapaxes函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Python中多線程的創(chuàng)建及基本調(diào)用方法
由于注明的GIL的存在,Python盡管能創(chuàng)建多個(gè)線程,但是多線程卻不能同時(shí)工作...well,這里我們來(lái)看一下Python中多線程的創(chuàng)建及基本調(diào)用方法2016-07-07在Python中操作時(shí)間之tzset()方法的使用教程
這篇文章主要介紹了在Python中操作時(shí)間之tzset()方法的使用教程,是Python學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05pycharm運(yùn)行程序時(shí)出現(xiàn)Run‘python tests for XXX.py‘問(wèn)題及
這篇文章主要介紹了pycharm運(yùn)行程序時(shí)出現(xiàn)Run ‘python tests for XXX.py‘問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08