创建虚拟环境
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'))
]