最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django使用AJAX調(diào)用自己寫的API接口的方法

 更新時(shí)間:2019年03月06日 08:52:08   作者:派派森森  
這篇文章主要介紹了Django使用AJAX調(diào)用自己寫的API接口的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

在這個(gè)例子中,我們將使用Django編寫?zhàn)I了么高校外賣商家查詢API接口,并且使用AJAX技術(shù)來實(shí)現(xiàn)API接口的使用,包括使用ajax get方法加載更多數(shù)據(jù),使用ajax方法來更新、修改、新增、刪除數(shù)據(jù)。利用API可以做到前后端分離,為開發(fā)web應(yīng)用提供了便利。

 安裝rest framework

首先使用Pycharm新建一個(gè)Django項(xiàng)目,并且使用virtualenv或者pipenv虛擬環(huán)境

創(chuàng)建成功會(huì)自動(dòng)安裝Django2.1和所需依賴,restframework框架需要自己手動(dòng)安裝

//激活虛擬環(huán)境安裝以下
(venv)$ pip install djangorestframework
(venv)$ pip install django-filter 
(venv)$ pip install pytest
(venv)$ pip install pytest-django 
//由于筆者使用Postgresql數(shù)據(jù)庫,所以還需要安裝以下
(venv)$ pip install psycopg2
//使用mysql數(shù)據(jù)庫安裝如下
(venv)$ pip install pymysql

準(zhǔn)備數(shù)據(jù)來提供服務(wù)

數(shù)據(jù)來源:餓了么爬蟲

數(shù)據(jù)內(nèi)容:全國所有大學(xué)附近的外賣商家Top20

數(shù)據(jù)需要導(dǎo)入數(shù)據(jù)庫

Django編寫rest api接口

項(xiàng)目結(jié)構(gòu)

settings.py.

// 安裝的app如下
INSTALLED_APPS = [
 #...
 'rest_framework',
 'django_filters',
 'api.apps.ApiConfig',
 'front.apps.FrontConfig',
]
//restframework 配置如下
REST_FRAMEWORK = {
//這里配置了分頁處理,每頁最多20個(gè)項(xiàng)目
'DEFAULT_PAGINATION_CLASS':'api.custompagination.LimitOffsetPaginationWithUpperBound',
 'PAGE_SIZE': 20,
 'DEFAULT_FILTER_BACKENDS': (
 //這里配置了排序、過濾、搜索器
 'django_filters.rest_framework.DjangoFilterBackend',
 'rest_framework.filters.OrderingFilter',
 'rest_framework.filters.SearchFilter',
 ),
 //這里配置了用戶認(rèn)證,管理員才可以更改內(nèi)容,未登錄不能更改
 'DEFAULT_AUTHENTICATION_CLASSES':(
 'rest_framework.authentication.BasicAuthentication',
 'rest_framework.authentication.SessionAuthentication',
 ),
 //這里配置了訪問次數(shù)限制,過多會(huì)返回429錯(cuò)誤 too many requests
 'DEFAULT_THROTTLE_CLASSES': (
 'rest_framework.throttling.AnonRateThrottle',
 'rest_framework.throttling.UserRateThrottle',
 ),
 //這里配置了訪問次數(shù),anon代表匿名用戶,user代表已登錄用戶,entries是我自己設(shè)置的作用域,300/hour代表最多300次每小時(shí)
 'DEFAULT_THROTTLE_RATES': {
 'anon': '300/hour',
 'user': '100/hour',
 'entries': '200/hour',
 },
 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.NamespaceVersioning',
}

models.py.

from django.db import models
class Entry(models.Model):
 city = models.CharField(max_length=50)
 school = models.CharField(max_length=100)
 link = models.CharField(max_length=100,null=True,default='null')
 name = models.CharField(max_length=200)
 lat = models.CharField(max_length=20,null=True,default='0.0')
 lng = models.CharField(max_length=20,null=True,default='0.0')
 address = models.CharField(max_length=200,null=True,default='null')
 distance = models.CharField(max_length=20,null=True,default='0')
 time = models.CharField(max_length=20,null=True,default='0:00')
 contact = models.CharField(max_length=200,null=True,default='null')
 score = models.CharField(max_length=10,null=True,default='0')
 comments = models.CharField(max_length=20,null=True,default='0')
 sell = models.CharField(max_length=20,null=True,default='0')
 image = models.CharField(max_length=200,null=True,default='null')
 owner = models.ForeignKey('auth.User',related_name='entries',on_delete=models.CASCADE)
 # class Meta:
 # ordering = ('name',)
 def __str__(self):
 return self.name

serializers.py.

from rest_framework import serializers
from api.models import Entry
//這里繼承自超鏈接模型序列器,用于把數(shù)據(jù)轉(zhuǎn)換為json格式,并且顯示鏈接
class EntrySerializer(serializers.HyperlinkedModelSerializer):
 owner = serializers.ReadOnlyField(source='owner.username')
 class Meta:
 model = Entry
 fields = ('url','pk','name','city','school','link','lat','lng','address','distance','time','contact',
 'score','comments','sell','image','owner')

views.py.

from rest_framework import generics
from rest_framework.response import Response
from rest_framework.reverse import reverse
from api.models import Entry
from api.serializers import EntrySerializer
from rest_framework import permissions
from rest_framework.permissions import IsAuthenticated
from rest_framework.throttling import ScopedRateThrottle
from api import custompermission
//這里是獲取所有數(shù)據(jù),可實(shí)現(xiàn)HTTP get、Post、Option操作
class EntryList(generics.ListCreateAPIView):
 //限流自定義作用域
 throttle_scope = 'entries'
 throttle_classes = (ScopedRateThrottle,)
 queryset = Entry.objects.all()
 serializer_class = EntrySerializer
 name = 'entry-list'
 filter_fields = ('city','school','name')
 search_fields = ('school','city')
 ordering_fields = ('city')

 //管理員才能post操作創(chuàng)建新的數(shù)據(jù)
 permission_classes = (
 permissions.IsAuthenticatedOrReadOnly,
 custompermission.IsCurrentUserOwnerOrReadOnly,
 )
 def perform_create(self, serializer):
 serializer.save(owner=self.request.user)

//這里是獲取具體某一項(xiàng)的數(shù)據(jù),可實(shí)現(xiàn)HTTP GET、PUT、PATCH、Option操作
class EntryDetail(generics.RetrieveUpdateDestroyAPIView):
 throttle_scope = 'entries'
 throttle_classes = (ScopedRateThrottle,)
 queryset = Entry.objects.all()
 serializer_class = EntrySerializer
 name = 'entry-detail'
 permission_classes = (
 permissions.IsAuthenticatedOrReadOnly,
 custompermission.IsCurrentUserOwnerOrReadOnly,
 )
//api根目錄
class ApiRoot(generics.GenericAPIView):
 name = 'api-root'
 def get(self, request, *args, **kwargs):
 return Response({
 'entries': reverse(EntryList.name, request=request),
 })

urls.py.

from django.urls import path
from api import views
urlpatterns = [
 path('entries/', views.EntryList.as_view(), name=views.EntryList.name),
 path('entry-detail/<int:pk>', views.EntryDetail.as_view(), name=views.EntryDetail.name),
 path('', views.ApiRoot.as_view(), name=views.ApiRoot.name)
]

ele/urls.py.

from django.urls import path,include
urlpatterns = [
 path('v1/',include('api.urls')),
 path('v1/api-auth/',include('rest_framework.urls')),
 path('',include('front.urls'))
] 

以下為啟動(dòng)界面

到此為止非常簡單的api就寫完了,接下來就是自動(dòng)化測試是否達(dá)到預(yù)期效果。 如圖,測試通過!

在程序中調(diào)用剛剛寫好的api

創(chuàng)建一個(gè)新的app并且添加到settings.py里面

(venv)$ python manage.py startapp front

做好的效果如下:點(diǎn)擊加載更多會(huì)觸發(fā)ajax

由于篇幅有限,這里貼出js代碼 使用ajax get請求剛剛寫好的api接口并且添加到表格中

myjs.js.

$('#load-more').click(function () {
 $.ajax({
 method:'GET',
 url:api_url,
 dataType:'json',
 success:function (data) {
 api_url = data['next'];
 if (api_url == null){
 $('#load-more').val('已加載全部');
 $('#load-more').attr('disabled',true);
 //api_url這里就是剛剛寫好的api接口
 api_url = 'v1/entries/';
 }
 var results = data['results'];
 for (i=0;i<results.length;i++){
 $('#ele-table-body').append(
 ' <tr>\n' +
 ' <th scope="col">'+results[i]['pk']+'</th>\n' +
 ' <th scope="col">'+results[i]['city']+'</th>\n' +
 ' <th scope="col"><a href="/detail/' + results[i]['pk'] +'" rel="external nofollow" >' + results[i]['name'] + '</a></th>\n' +
 ' <th scope="col">'+results[i]['school']+'</th>\n' +
 ' <th scope="col">'+results[i]['score']+'</th>\n' +
 ' </tr>'
 )
 }
 }
 })
 });

可以修改具體的一條數(shù)據(jù),使用ajax patch方法提交數(shù)據(jù)。 注:PUT方法是修改所有數(shù)據(jù),而PATCH方法是修改局部數(shù)據(jù)

myjs.js.

 $('#edit-confirm-btn').click(function () {
 var name = $('#name').val();
 var distance = $('#distance').val();
 var adderss = $('#address').val();
 var time = $('#time').val();
 var score = $('#score').val();
 var comments = $('#comments').val();
 var sell = $('#sell').val();
 var pk = $('#pk').val();
 $.ajax({
 type:'PATCH',
 url:'/detail/' + pk,
 data:{
 "name": name,
 "distance": distance,
 "address": adderss,
 "time": time,
 "score": score,
 "comments": comments,
 "sell": sell,
 },
 success:function (data) {
 if (data.status == 'ok'){
 console.log('success');
 location.reload();
 }
 }
 })
 })

本文通過一個(gè)小例子介紹了如何使用Django調(diào)用自己寫的api

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Python代碼實(shí)現(xiàn)對Excel單元格的鎖定

    使用Python代碼實(shí)現(xiàn)對Excel單元格的鎖定

    在Excel表格中,我們可以通過鎖定特定的單元格或區(qū)域,防止對單元格內(nèi)容進(jìn)行隨意修改,確保關(guān)鍵數(shù)據(jù)、公式或格式不被誤改,本文將介紹如何使用Python代碼來實(shí)現(xiàn)對Excel單元格的鎖定,實(shí)現(xiàn)批量操作以及自動(dòng)化,需要的朋友可以參考下
    2024-06-06
  • 深入理解python多進(jìn)程編程

    深入理解python多進(jìn)程編程

    下面小編就為大家?guī)硪黄钊肜斫鈖ython多進(jìn)程編程。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 詳細(xì)解讀python操作json文件的詳細(xì)

    詳細(xì)解讀python操作json文件的詳細(xì)

    這篇文章主要為大家介紹了python操作json文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • PyCharm使用之配置SSH Interpreter的方法步驟

    PyCharm使用之配置SSH Interpreter的方法步驟

    這篇文章主要介紹了PyCharm使用之配置SSH Interpreter的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • pyinstaller通過spec文件打包py程序的步驟

    pyinstaller通過spec文件打包py程序的步驟

    這篇文章主要介紹了pyinstaller通過spec文件打包py程序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • python打開url并按指定塊讀取網(wǎng)頁內(nèi)容的方法

    python打開url并按指定塊讀取網(wǎng)頁內(nèi)容的方法

    這篇文章主要介紹了python打開url并按指定塊讀取網(wǎng)頁內(nèi)容的方法,涉及Python操作URL及網(wǎng)頁內(nèi)容的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Python編程不要再使用print調(diào)試代碼了

    Python編程不要再使用print調(diào)試代碼了

    這篇文章主要為大家介紹了Python編程中代碼的調(diào)試技巧,不要只會(huì)用print調(diào)試哦~其他的Python調(diào)試技巧,大家來一起共同學(xué)習(xí)下吧,祝大家多多進(jìn)步,早日升職加薪
    2021-10-10
  • python區(qū)塊及區(qū)塊鏈的開發(fā)詳解

    python區(qū)塊及區(qū)塊鏈的開發(fā)詳解

    這篇文章主要介紹了python區(qū)塊及區(qū)塊鏈的開發(fā)詳解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明

    Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明

    這篇文章主要介紹了Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2017-10-10
  • python使用Qt界面以及邏輯實(shí)現(xiàn)方法

    python使用Qt界面以及邏輯實(shí)現(xiàn)方法

    這篇文章主要介紹了python使用Qt界面以及邏輯實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評論

彰化县| 科技| 昭平县| 周宁县| 黄浦区| 祁门县| 鲁甸县| 临汾市| 文登市| 民县| 湘西| 灵石县| 平阴县| 台前县| 通辽市| 全南县| 汕尾市| 雷波县| 瑞昌市| 乌拉特后旗| 烟台市| 永修县| 丹棱县| 方正县| 浦北县| 舞阳县| 临江市| 孟村| 班戈县| 平阴县| 呼图壁县| 重庆市| 虞城县| 江门市| 霍山县| 清新县| 青川县| 巧家县| 达州市| 锦屏县| 高平市|