• 可以创建个虚拟环境先,不过我没使用这个方式
virtualenv env
source env/bin/activate
------
退出:
To exit the virtualenv environment at any time, just type deactivate

安装必要库

pip install django
pip install djangorestframework
pip install pygments # We'll be using this for the code highlighting
  1. 创建一个工程
cd ~
django-admin.py startproject exampleRest
cd exampleRest
  1. 在工程下创建一个app
python manage.py startapp snippets
  1. 在工程的settings中增加app的配置 : settings.py
INSTALLED_APPS = (
...
'rest_framework',
'snippets.apps.SnippetsConfig',
)
  1. 在app的models中创建一张表: models.py
from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles # 将 language 和 style 排序提取出来
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',)
  1. 将创建的表初始化,并且提交生成DB格式
python manage.py makemigrations snippets
python manage.py migrate
  1. 创建一个序列化类 Creating a Serializer class:serializer.py
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES # 定义了获得序列化/反序列化的字段
class SnippetSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100)
code = serializers.CharField(style={'base_template': 'textarea.html'})
linenos = serializers.BooleanField(required=False)
language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly') #create()和update()方法定义在调用serializer.save()时如何创建或修改完整的实例。
def create(self, validated_data):
"""
Create and return a new `Snippet` instance, given the validated data.
"""
return Snippet.objects.create(**validated_data) def update(self, instance, validated_data):
"""
Update and return an existing `Snippet` instance, given the validated data.
"""
instance.title = validated_data.get('title', instance.title)
instance.code = validated_data.get('code', instance.code)
instance.linenos = validated_data.get('linenos', instance.linenos)
instance.language = validated_data.get('language', instance.language)
instance.style = validated_data.get('style', instance.style)
instance.save()
return instance
  • 序列化类非常类似于Django表单类,并在各个字段(如required、max_length和default)中包含类似的验证标志。
  • 字段标志还可以控制在某些情况下应该如何显示序列化程序,例如在呈现为HTML时。上面的{'base_template':'textarea.html'}标志等同于在Django Form类上使用widget = widgets.Textarea。这对于控制如何显示可浏览的API特别有用.
  1. 就像Django提供Form类和ModelForm类一样,REST框架包括Serializer类和ModelSerializer类。
class SnippestSerializer(serializers.ModelSerializer):
class Meta:
model = Snippest
fields = ('id','title','code','linenos','language','style')
  1. serializers 序列化 有一个nice的特性就是,可以通过打印(print) its representation 来检查序列化实例(serializers instance)中的所有字段(fields)
  • 运行python manage.py shell ,在其中运行如下代码:
from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer)) #-----------
# SnippetSerializer():
# id = IntegerField(label='ID', read_only=True)
# title = CharField(allow_blank=True, max_length=100, required=False)
# code = CharField(style={'base_template': 'textarea.html'})
# linenos = BooleanField(required=False)
# language = ChoiceField(choices=[('Clipper', 'FoxPro'), ('Cucumber', 'Gherkin'), ('RobotFramework', 'RobotFramework'), ('abap', 'ABAP'), ('ada', 'Ada')...
# style = ChoiceField(choices=[('autumn', 'autumn'), ('borland', 'borland'), ('bw', 'bw'), ('colorful', 'colorful')...

ModelSerializer类不会做任何有意义的事情,它们只是创建序列化类的捷径

  • 自动设定已存在的一组字段。
  • create()和update()方法的简单默认实现。
  1. 在snippest类的 views.py 中编写常规视图(just write the views as regular Django views.)
from django.http import HttpResponse,JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from snippests.models import Snippest
from snippests.serializer import SnippestSerializer
  1. 在 views.py 中,我们的API的根将是一个视图,它支持:
a. 列出所有现有的代码片段,
b. 或者创建一个新的代码片段。
@csrf_exempt
def snippest_list(request):
# 列出所有的代码段,或者创建一个新的代码段
if request.method == 'GET': # 如果是get方法
snippests = Snippest.objects.all() # 获取models中的所有信息
serializer = SnippestSerializer(snippests,many=True) # 将这些信息序列化
print(serializer)
print(22222222222)
print(serializer.data)
return JsonResponse(serializer.data,safe=False) # 用json格式处理serializer的所有 data数据 elif request.method == 'POST': # 如果是post方法
data = JSONParser().parse(request) # 用json处理 request传递来的data数据
serializer = SnippestSerializer(data=data) # 并将其序列化后存到变量serializer中 if serializer.is_valid(): # 如果序列化后的数据有效
serializer.save() # 将其存储
return JsonResponse(serializer.data,status=201) # 返回有效的serializer data数据 和status状态为201
return JsonResponse(serializer.errors,status=400) #如果序列化后数据无效,则返回errors,并更新status状态为400
  • 请注意,因为我们希望能够从不具有CSRF令牌的客户端POST数据发布到这个视图(view),所以需要将视图标记为csrf_exempt。 这不是常用的方法,REST框架视图实际上提供了更明智的方法来处理,现在暂时用此方法满足需求。
  1. 还需要一个与单个代码片段相对应的视图,可以用于检索、更新或删除代码片段,在views.py 中补充如下:
@csrf_exempt
def snippest_detail(request,pk):
# 检索、更新或删除代码段
try:
snippest = Snippest.objects.get(pk=pk) # 读取models中 snippest的所有信息
except Snippest.DoesNotExist: # 读不到的话,说明它不存在
return HttpResponse(status=404) # 返回一个404 if request.method == 'GET': #如果有数据,那么如果是get方法
serializer = SnippestSerializer(snippest) # 将信息序列化
return JsonResponse(serializer.data) # 返回json格式的serializer 数据 elif request.method == 'PUT':
data = JSONParser().parse(request) # 用json处理 request传递来的data数据
serializer = SnippestSerializer(Snippest,data=data) # 并将其序列化后存到变量serializer中
if serializer.is_valid(): # 如果序列化后的数据有效
serializer.save() # 将其存储
return JsonResponse(serializer.data) # 返回有效的serializer data数据
return JsonResponse(serializer.errors,status=400) #如果序列化后数据无效,则返回errors,并更新status状态为400 elif request.method == 'DELETE':
snippest.delete()
return HttpResponse(status=204)
  1. 最后,需要配置view的url,在snippest 下新建 urls.py :
from django.conf.urls import url
from snippets import views urlpatterns = [
url(r'^snippets/$', views.snippet_list),
url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail),
]
  1. 还要配置exampleRest工程下的 urls.py:
from django.conf.urls import url, include

urlpatterns = [
url(r'^', include('snippets.urls')),
]
  • 如果我们发送格式不正确的json,或者如果请求是由视图无法处理的方法进行的,那么最终将得到“服务器错误 500”的响应
  1. Testing our first attempt at a Web API
» python manage.py runserver
Performing system checks... System check identified no issues (0 silenced).
May 12, 2018 - 07:13:08
Django version 2.0.5, using settings 'exampleRest.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
  1. 在浏览器中访问:http://127.0.0.1:8000/,看到如下信息:

  1. 访问http://127.0.0.1:8000/snippests,对应的是 views.py 中snippest_list方法返回的内容:
return JsonResponse(serializer.data,safe=False) # 用json格式处理serializer的所有 data数据

  1. 访问http://127.0.0.1:8000/snippests/1,对应的是 views.py 中snippest_detail方法返回的内容:
@csrf_exempt
def snippest_detail(request,pk):
# 检索、更新或删除代码段
try:
snippest = Snippest.objects.get(pk=pk) # 读取models中 snippest的所有信息
except Snippest.DoesNotExist: # 读不到的话,说明它不存在
return HttpResponse(status=404) # 返回一个404

  1. 也可使用shell 查看view内容,注意路径最后的''/' 

django下的framework的更多相关文章

  1. Django之REST framework源码分析

    前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...

  2. django下的ckeditor 5.0 文本编辑器上传功能。

    完整的后台界面怎么可以没有文本编辑器,但是django的admin界面很疑惑,没有自带文本编辑器,好在网上有不少成型的库可以用 我用的是ckeditor编辑器,安装和配置我引用别人的博客 这篇博客配置 ...

  3. django下进行项目的部署

    -------------------Django下进行对应的服务器配置1.服务器购买 本人在阿里云购买了一个服务器,操作系统为windows server2008/Linux(ubuntu) 2.服 ...

  4. Django’s cache framework

    小结: 1.缓存存储位置:数据库.文件系统.内存 2.通过缓存前缀实现跨服务器缓存 Django’s cache framework | Django documentation | Django h ...

  5. Python学习---django下的cookie操作 180201

    什么是Cookies 什么是Cookies cookies设置的原因: 1. http请求的无记忆性: 2.加快访问速度  3. 减少服务器压力 cookies特点: cookies保存在客户端浏览器 ...

  6. django下的csrf防御机制

    CSRF 1.什么是CSRF? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写 ...

  7. Django下MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL解惑

    Django中settings中的四个设置参数的一些故事: MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL 1.MEDIA_ROOT与MEDIA_URL ...

  8. django的rest framework框架——安装及基本使用

    一.django的FBV 和 CBV 1.FBV(基于函数的视图): urlpatterns = [ url(r'^users/', views.users), ] def users(request ...

  9. 重新认识了下Entity Framework

    什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...

随机推荐

  1. NowCoder数列

    题目:https://www.nowcoder.com/questionTerminal/0984adf1f55a4ba18dade28f1ab15003 #include <iostream& ...

  2. css - 单词的自动换行问题

    转载自:解决文档中有url链接时被强制换行的问题 问题 当行内出现很长的英文单词或者url的时候,会出现自动换行的问题,为了美化页面,往往会希望这些很长的英文单词或者url能够断开来,超出的部分换行到 ...

  3. Centos 内存释放

    原因:最近发现服务器老师提示内存不足的警报,很多时候内存都占用百分之80以上,查看运行的服务似乎并没有占用很大的内存,top查看运行的服务,然后按shift+m排名第一的才百分之1.x,看了别人的博客 ...

  4. Centos 配置 Mysql 主从双向同步

    配置之前,请先阅读mysql主从复制: Mysql-主从复制 原:  主从环境: 主服务器:192.168.153.130 从服务器:192.168.153.131 1.从数据库创建同步用户,将主数据 ...

  5. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

    题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...

  6. DP+埃氏筛法 Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:b+1,b+2,...,a 所有数的素数个数和 DP+埃氏筛法:dp[i] 记录i的素数个数和,若i是素数,则为1:否则它可以从一个数乘以素数递推过来 最后改为i之前所有素数个 ...

  7. Linux文件和目录的777、755、644权限解释

    Linux文件和目录的权限 1.文件权限 在linux系统中,文件或目录的权限可以分为3种: r:4 读 w:2 写 x:1  执行(运行)-:对应数值0 数字 4 .2 和 1表示读.写.执行权限 ...

  8. Coursera:一流大学免费在线课程平台

    https://www.coursera.org/ 微软联合创始人 Bill Gates 从公司退隐后,一直和妻子 Melinda 忙于公益事业.但离开 IT 圈并未改变他穿廉价衬衫和保持学习的习惯— ...

  9. ionic back 返回按钮不正常显示&&二级路由点击返回按钮失效无法返回到上一级页面的问题

    很多时候,app不只有一两级路由,还要三四级路由,但是在ionic中,给出的返回键三级或四级无法使用,所以得自定义方法设置返回. 直接贴代码: <ion-nav-buttons side=&qu ...

  10. Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理

    前言: 如果说J.U.C包下的核心是什么?那我想答案只有一个就是AQS.那么AQS是什么呢?接下来让我们一起揭开AQS的神秘面纱 AQS是什么? AQS是AbstractQueuedSynchroni ...