成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

django rest framework個(gè)人學(xué)習(xí)筆記(六)————Tutorial4.認(rèn)證于授權(quán)

MonoLog / 3245人閱讀

摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶(hù)擁有讀寫(xiě)權(quán)限,而未認(rèn)證用戶(hù)只有讀的權(quán)限。唯一的限制是必須是。

官網(wǎng)地址
目前,我們的API沒(méi)有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到:

Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān)

只有認(rèn)證的用戶(hù)才能夠創(chuàng)建snippets

只有創(chuàng)建者才能更新或者刪除他的snippet

沒(méi)有認(rèn)真的用戶(hù)應(yīng)該只能讀

向我們的model添加內(nèi)容

我們對(duì)我們的code snippets models做一些修改。首先,我們添加幾個(gè)字段。其中一個(gè)字段用于表示code snippet的創(chuàng)建者。另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的HTML表示形式。
添加下列兩個(gè)字段到 models.py文件中的Snippetmodel。

owner = models.ForeignKey("auth.User",related_name="snippets",on_delete=models.CASADE)
highlighted = models.TextField()

我們也需要確保,當(dāng)這個(gè)model被保存的時(shí)候,我們使用pygments代碼高亮庫(kù)來(lái)填充我們的highlighted字段。
我們需要導(dǎo)入一些東西:

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"庫(kù)來(lái)創(chuàng)建高亮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)

當(dāng)所有都昨晚之后,我們需要更新我們的數(shù)據(jù)庫(kù)。通常,為了實(shí)現(xiàn)這一點(diǎn),我們會(huì)創(chuàng)建數(shù)據(jù)遷移文件(migration),但是本教程用于教學(xué),所以我們直接刪除數(shù)據(jù)庫(kù)并重新創(chuàng)建。

rm -f db.sqlite3
rm -r snippets/migrations
python manage.py makemigrations snippets
python manage.py migrate

你也可以創(chuàng)建幾個(gè)不同的用戶(hù)來(lái)測(cè)試我們的API。最快的方式就是使用createsuperuser命令。

python manage.py createsuperuser
為我們的User models 添加終端

現(xiàn)在,我們有一些可用的用戶(hù)了。我們最好為我們的API添加用戶(hù)代理。

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"}

因?yàn)?b>snippets是Usermodels 的反向關(guān)系,在默認(rèn)的ModelSerializerclass中,并不會(huì)包含這種關(guān)系,所以我們需要添加一個(gè)明確的字段來(lái)表示這個(gè)關(guān)系。

我們還需要添加一些view在views.py文件中。我們希望我們的用戶(hù)表示為只讀視圖。所以我們使用ListAPIViewRetrieveAPIView通用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[0-9]+)/$", views.UserDetail.as_view()),
關(guān)聯(lián)User和Snippets

現(xiàn)在,如果我們創(chuàng)建一個(gè)code snippet,我們無(wú)法將創(chuàng)建的snippet和創(chuàng)建者關(guān)聯(lián)起來(lái),User數(shù)據(jù)不是作為序列化的一部分發(fā)送的,而是作為request的一個(gè)屬性.我們處理這個(gè)問(wèn)題的方法是,在我們的snippet views中重寫(xiě).perform_create()方法,這允許我們修改實(shí)例保存的方式,處理任何傳入請(qǐng)求和請(qǐng)求url中的參數(shù)。
SnippetListview class中,添加如下方法:

def perform_create(self,serializer):
    serializer.save(owner=self.request.user)

我們的create()序列化方法將會(huì)從request中驗(yàn)證通過(guò)的數(shù)據(jù)里添加額外的owner字段。

更新我們的serializer

現(xiàn)在,我們的snippet已經(jīng)和他的創(chuàng)建者關(guān)聯(lián)了。讓我們來(lái)更新SnippetSerializer來(lái)體現(xiàn)這個(gè)關(guān)聯(lián)。添加以下的字段在我們的serializers.py文件中:

owner = serializers.ReadOnlyField(source="owner.username")

注意:確保你的Meta class的fields中添加了"owner"
這個(gè)字段做了一個(gè)很有趣的事。這個(gè)source參數(shù)控制哪一個(gè)屬性用于填充字段,并且可以指向這個(gè)序列化實(shí)例上的任何屬性,它也可以使用.來(lái)訪問(wèn)屬性下的屬性,這類(lèi)似于django的模板語(yǔ)言.
這個(gè)字段我們也能夠添加ReadOnlyFieldclass,來(lái)不同于其他字段,如CharField,BooleanField等...ReadOnlyField永遠(yuǎn)只能讀,并且使用序列化表示,但是當(dāng)我們反序列化時(shí),不能更新模塊。我們也能夠使用CharField(read_only=True)

為我們的視圖添加必要的權(quán)限

現(xiàn)在,我們的code snippets 已經(jīng)和users關(guān)聯(lián),我們希望確保只有認(rèn)證的用戶(hù)才能夠創(chuàng)建,更新和刪除code snippets。
REST framework包含了幾種permission class,我們可以使用這些類(lèi)來(lái)限制哪些人有權(quán)限使用這些view.在這個(gè)案例中,我們需要的是IsAuthenticateOrReadOnly。這將確保認(rèn)證用戶(hù)擁有讀寫(xiě)權(quán)限,而未認(rèn)證用戶(hù)只有讀的權(quán)限。
首先,添加以下的內(nèi)容到views模塊。

from rest_framework import permissions

然后,添加以下的屬性到SnippetListSnippetDetailview classes

permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
在我們的Browsable API中添加登錄

如果你打開(kāi)瀏覽器并導(dǎo)航到browsable API,你發(fā)現(xiàn)你沒(méi)有登錄,不能夠創(chuàng)建新的code snippets.為了做到這一點(diǎn),我們需要用戶(hù)能夠登錄。
我們能夠在我們的browsable API中添加login view,來(lái)編寫(xiě)我們的項(xiàng)目級(jí)urls.py文件(根urls.py文件)。
添加以下內(nèi)容到文件中:

from django.conf.urls import include

然后,添加login和logout view在我們的browsable API.

urlpatterns += [
    url(r"^api-auth/",include("rest_framework.urls",namespace="rest_framework")),
]

事實(shí)上,r"^api-auth/"部分,你可以使用任何你想用的url。唯一的限制是namespace必須是rest_framework。在django1.9+中,REST framework將設(shè)置namespace,所以你可以把這個(gè)限制排除在外。
現(xiàn)在,如果你再一次打開(kāi)瀏覽器并刷新頁(yè)面,你將會(huì)看到頁(yè)面的右上角看到登錄鏈接。
創(chuàng)建了一些code snippets后,導(dǎo)航到"users/",在每個(gè)user的snippets字段中,都會(huì)顯示相對(duì)應(yīng)的code snippets。

Object級(jí)別的權(quán)限

我們希望所有用戶(hù)都能看到所有code snippets,但是只有創(chuàng)建者能夠修改或者刪除他的code snippets.
為了實(shí)現(xiàn)這個(gè)功能,我們需要?jiǎng)?chuàng)建一個(gè)自定義的permission.
在snippets app 中,創(chuàng)建一個(gè)新文件permissions.py

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    自定義permission 保證只有所有者能夠編寫(xiě)。
    """
    def has_object_permission(self,request,view,obj):
        #任何請(qǐng)求都擁有讀權(quán)限
        #所以我們永遠(yuǎn)允許GET,HEAD,OPTIONS requests
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user

現(xiàn)在,我們將我們自定義的permission添加到snippetDetailview class中:

    permission_classes = (permissions.IsAuthenticateOrReadOnly,IsOwnerOrReadOnly)
API認(rèn)證

因?yàn)槲覀儸F(xiàn)在為我們的API設(shè)置了permission,如果我們需要寫(xiě)任何snippets,我們需要認(rèn)證我們的請(qǐng)求。我們還沒(méi)有設(shè)置任何身份認(rèn)證,所以默認(rèn)的認(rèn)證是sessionAuthenticationBasucAuthentication.當(dāng)我們通過(guò)瀏覽器與API交互時(shí),我們可以登錄,然后瀏覽器的session將會(huì)為我們的請(qǐng)求提供身份認(rèn)證。如果我們以編程的方式于API進(jìn)行交互,我們需要在每個(gè)請(qǐng)求上顯式地提供身份驗(yàn)證憑證。
如果我們嘗試創(chuàng)建一個(gè)snippet,就會(huì)得到一個(gè)錯(cuò)誤:

http POST http://127.0.0.1:8000/snippets/ code="print 123"

{
    "detail": "Authentication credentials were not provided."
}

我們可以包含我們的賬戶(hù)名密碼來(lái)請(qǐng)求創(chuàng)建:

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"
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44461.html

相關(guān)文章

  • django rest framework個(gè)人學(xué)習(xí)筆記)————Tutorial4.認(rèn)證授權(quán)

    摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶(hù)擁有讀寫(xiě)權(quán)限,而未認(rèn)證用戶(hù)只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒(méi)有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶(hù)才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒(méi)有認(rèn)...

    eternalshallow 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記)————Tutorial4.認(rèn)證授權(quán)

    摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶(hù)擁有讀寫(xiě)權(quán)限,而未認(rèn)證用戶(hù)只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒(méi)有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶(hù)才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒(méi)有認(rèn)...

    caozhijian 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(一)————Install

    摘要:本文主要是用來(lái)記錄自己學(xué)習(xí)的過(guò)程。其中可能會(huì)有很多自己的錯(cuò)誤理解。這里主要會(huì)用到的知識(shí)有百度百科阮一峰理解架構(gòu)其余請(qǐng)自行百度。所有的全局設(shè)置都放在的字典中。使用標(biāo)準(zhǔn)的權(quán)限,未認(rèn)證的用戶(hù)只讀權(quán)限不要忘記將添加到你的中。 本文主要是用來(lái)記錄自己學(xué)習(xí)django-rest-framework的過(guò)程。其中可能會(huì)有很多自己的錯(cuò)誤理解。 這里主要會(huì)用到的知識(shí)有 1. [django](https:...

    yuxue 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(一)————Install

    摘要:本文主要是用來(lái)記錄自己學(xué)習(xí)的過(guò)程。其中可能會(huì)有很多自己的錯(cuò)誤理解。這里主要會(huì)用到的知識(shí)有百度百科阮一峰理解架構(gòu)其余請(qǐng)自行百度。所有的全局設(shè)置都放在的字典中。使用標(biāo)準(zhǔn)的權(quán)限,未認(rèn)證的用戶(hù)只讀權(quán)限不要忘記將添加到你的中。 本文主要是用來(lái)記錄自己學(xué)習(xí)django-rest-framework的過(guò)程。其中可能會(huì)有很多自己的錯(cuò)誤理解。 這里主要會(huì)用到的知識(shí)有 1. [django](https:...

    yagami 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(一)————Install

    摘要:本文主要是用來(lái)記錄自己學(xué)習(xí)的過(guò)程。其中可能會(huì)有很多自己的錯(cuò)誤理解。這里主要會(huì)用到的知識(shí)有百度百科阮一峰理解架構(gòu)其余請(qǐng)自行百度。所有的全局設(shè)置都放在的字典中。使用標(biāo)準(zhǔn)的權(quán)限,未認(rèn)證的用戶(hù)只讀權(quán)限不要忘記將添加到你的中。 本文主要是用來(lái)記錄自己學(xué)習(xí)django-rest-framework的過(guò)程。其中可能會(huì)有很多自己的錯(cuò)誤理解。 這里主要會(huì)用到的知識(shí)有 1. [django](https:...

    idisfkj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<