摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。
官網地址
目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到:
Code snippets 應該永遠和創建者相關
只有認證的用戶才能夠創建snippets
只有創建者才能更新或者刪除他的snippet
沒有認真的用戶應該只能讀
向我們的model添加內容我們對我們的code snippets models做一些修改。首先,我們添加幾個字段。其中一個字段用于表示code snippet的創建者。另外一個字段用于儲存突出顯示的代碼的HTML表示形式。
添加下列兩個字段到 models.py文件中的Snippetmodel。
owner = models.ForeignKey("auth.User",related_name="snippets",on_delete=models.CASADE) highlighted = models.TextField()
我們也需要確保,當這個model被保存的時候,我們使用pygments代碼高亮庫來填充我們的highlighted字段。
我們需要導入一些東西:
from pygments.lexers import get_lexer_by_name from pygments.formatters.html import HtmlFormatter from pygments import highlight
然后我們需要為我們的Snippetmodel添加.save()方法
def save(self,*args,**kwargs): """ 使用"pygments"庫來創建高亮HTML代碼的表示 """ lexer = get_lexer_by_name(self.language) linenos = self.linenos and "table" or False options = self.title and {"title": self.title} or {} formatter = HtmlFormatter(style=self.style, linenos=linenos, full=True, **options) self.highlighted = highlight(self.code, lexer, formatter) super(Snippet, self).save(*args, **kwargs)
當所有都昨晚之后,我們需要更新我們的數據庫。通常,為了實現這一點,我們會創建數據遷移文件(migration),但是本教程用于教學,所以我們直接刪除數據庫并重新創建。
rm -f db.sqlite3 rm -r snippets/migrations python manage.py makemigrations snippets python manage.py migrate
你也可以創建幾個不同的用戶來測試我們的API。最快的方式就是使用createsuperuser命令。
python manage.py createsuperuser為我們的User models 添加終端
現在,我們有一些可用的用戶了。我們最好為我們的API添加用戶代理。
from django.contrib.auth.models import User class UserSerializer(serializer.ModelSerializer): snippets = serializer.PrimaryKeyRelatedField(many=True,queryset=Snippet.objects.all()) class Meta: model = User fields = {"id","username","snippets"}
因為snippets是Usermodels 的反向關系,在默認的ModelSerializerclass中,并不會包含這種關系,所以我們需要添加一個明確的字段來表示這個關系。
我們還需要添加一些view在views.py文件中。我們希望我們的用戶表示為只讀視圖。所以我們使用ListAPIView和RetrieveAPIView通用class-based views.
from django.contrib.auth.models import User from snippets.Serializers import UserSerializer class UserList(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer class UserDetail(generics.RetrieveAPIView): queryset = User.object.all() serializer_class = UserSerializer
最后,我們需要添加我們的視圖到API中,添加以下的patterns到urls.py文件中:
url(r"^users/$", views.UserList.as_view()), url(r"^users/(?P關聯User和Snippets[0-9]+)/$", views.UserDetail.as_view()),
現在,如果我們創建一個code snippet,我們無法將創建的snippet和創建者關聯起來,User數據不是作為序列化的一部分發送的,而是作為request的一個屬性.我們處理這個問題的方法是,在我們的snippet views中重寫.perform_create()方法,這允許我們修改實例保存的方式,處理任何傳入請求和請求url中的參數。
在SnippetListview class中,添加如下方法:
def perform_create(self,serializer): serializer.save(owner=self.request.user)
我們的create()序列化方法將會從request中驗證通過的數據里添加額外的owner字段。
更新我們的serializer現在,我們的snippet已經和他的創建者關聯了。讓我們來更新SnippetSerializer來體現這個關聯。添加以下的字段在我們的serializers.py文件中:
owner = serializers.ReadOnlyField(source="owner.username")
注意:確保你的Meta class的fields中添加了"owner"
這個字段做了一個很有趣的事。這個source參數控制哪一個屬性用于填充字段,并且可以指向這個序列化實例上的任何屬性,它也可以使用.來訪問屬性下的屬性,這類似于django的模板語言.
這個字段我們也能夠添加ReadOnlyFieldclass,來不同于其他字段,如CharField,BooleanField等...ReadOnlyField永遠只能讀,并且使用序列化表示,但是當我們反序列化時,不能更新模塊。我們也能夠使用CharField(read_only=True)
現在,我們的code snippets 已經和users關聯,我們希望確保只有認證的用戶才能夠創建,更新和刪除code snippets。
REST framework包含了幾種permission class,我們可以使用這些類來限制哪些人有權限使用這些view.在這個案例中,我們需要的是IsAuthenticateOrReadOnly。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。
首先,添加以下的內容到views模塊。
from rest_framework import permissions
然后,添加以下的屬性到SnippetList和SnippetDetailview classes
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)在我們的Browsable API中添加登錄
如果你打開瀏覽器并導航到browsable API,你發現你沒有登錄,不能夠創建新的code snippets.為了做到這一點,我們需要用戶能夠登錄。
我們能夠在我們的browsable API中添加login view,來編寫我們的項目級urls.py文件(根urls.py文件)。
添加以下內容到文件中:
from django.conf.urls import include
然后,添加login和logout view在我們的browsable API.
urlpatterns += [ url(r"^api-auth/",include("rest_framework.urls",namespace="rest_framework")), ]
事實上,r"^api-auth/"部分,你可以使用任何你想用的url。唯一的限制是namespace必須是rest_framework。在django1.9+中,REST framework將設置namespace,所以你可以把這個限制排除在外。
現在,如果你再一次打開瀏覽器并刷新頁面,你將會看到頁面的右上角看到登錄鏈接。
創建了一些code snippets后,導航到"users/",在每個user的snippets字段中,都會顯示相對應的code snippets。
我們希望所有用戶都能看到所有code snippets,但是只有創建者能夠修改或者刪除他的code snippets.
為了實現這個功能,我們需要創建一個自定義的permission.
在snippets app 中,創建一個新文件permissions.py:
from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): """ 自定義permission 保證只有所有者能夠編寫。 """ def has_object_permission(self,request,view,obj): #任何請求都擁有讀權限 #所以我們永遠允許GET,HEAD,OPTIONS requests if request.method in permissions.SAFE_METHODS: return True return obj.owner == request.user
現在,我們將我們自定義的permission添加到snippetDetailview class中:
permission_classes = (permissions.IsAuthenticateOrReadOnly,IsOwnerOrReadOnly)API認證
因為我們現在為我們的API設置了permission,如果我們需要寫任何snippets,我們需要認證我們的請求。我們還沒有設置任何身份認證,所以默認的認證是sessionAuthentication和BasucAuthentication.當我們通過瀏覽器與API交互時,我們可以登錄,然后瀏覽器的session將會為我們的請求提供身份認證。如果我們以編程的方式于API進行交互,我們需要在每個請求上顯式地提供身份驗證憑證。
如果我們嘗試創建一個snippet,就會得到一個錯誤:
http POST http://127.0.0.1:8000/snippets/ code="print 123" { "detail": "Authentication credentials were not provided." }
我們可以包含我們的賬戶名密碼來請求創建:
http -a tom:password123 POST http://127.0.0.1:8000/snippets/ code="print 789" { "id": 1, "owner": "tom", "title": "foo", "code": "print 789", "linenos": false, "language": "python", "style": "friendly" }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44461.html
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
閱讀 2537·2021-11-24 10:20
閱讀 2385·2021-09-10 10:51
閱讀 3370·2021-09-06 15:02
閱讀 3105·2019-08-30 15:55
閱讀 2835·2019-08-29 18:34
閱讀 3070·2019-08-29 12:14
閱讀 1206·2019-08-26 13:53
閱讀 2916·2019-08-26 13:43