使用REST-Framework做Django后端接口

本文介绍了如何利用Django的REST-Framework构建后端API接口,包括创建虚拟环境、安装依赖、定义Model、编写序列化类、设计 Views 和处理CSRF保护。讲解了在Django中开启和禁用CSRF保护的方法,并提到了在模板中使用CSRF token的细节。
摘要由CSDN通过智能技术生成

创建虚拟环境

python3 -m venv env
source env/bin/activate

下载依赖

pip install django
pip install djangorestframework
pip install pyments

开始

创建app

python manage.py startapp snippets

添加app到settings.py

INSTALLED_APPS=[
    'rest_framework',
    'snippets',
]

创建Model

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted([(item, item) for item in get_all_styles()])


class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Meta:
        ordering = ['created']

整合model

python manage.py makemigrations snippets
python manage.py migrate

创建一个序列化类

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model=Snippet
        fields=['id','title','code','linenos','language','style']

创建Views

@csrf_exempt
def snippet_list(request):
    if request.method=='GET':
        snippets=Snippet.objects.all()
        serializer=SnippetSerializer(snippets,many=True)
        return JsonResponse(serializer.data,safe=False)
    elif request.method=='POST':
        data=JSONParser().parse(request)
        serializer=SnippetSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data,status=201)
        return JsonResponse(serializer.errors,status=400)
    
    
@csrf_exempt
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        snippet.delete()
        return HttpResponse(status=204)

解释一下:

django为了用户实现防止跨站请求伪造的功能,通过中间件django.middleware.csrf.CsrfViewMiddleware来完成

局部

@csrf_protect 为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件

@csrf_exempt 取消当前函数的防跨站请求功能

我们在form表单的时候会添加{%csrf_token%}会生成csrf的随机字符

设置urls.py

urlpatterns=[
    path('snippets/',views.snippet_list),
    path('snippets/<int:pk>/',views.snippet_detail)
]

urlpatterns=[
    path('',include('snippets.urls'))
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值