• django下的framework


    • 可以创建个虚拟环境先,不过我没使用这个方式
    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) # 并将其序列化后存到变量serializerif 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)  # 并将其序列化后存到变量serializerif 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/,看到如下信息:

    image

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

    image

    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
    

    image

    1. 也可使用shell 查看view内容,注意路径最后的''/' image
  • 相关阅读:
    java8
    Python isinstance()
    Python3 File next()
    np.array() 与 np.mat() 比较
    np.nonzero()
    np.dot()
    算法之归并排序的应用 —— 小和问题以及逆序对问题
    递归过程以及递归master公式
    算法之异或运算及其应用
    算法之二分法及其应用
  • 原文地址:https://www.cnblogs.com/vivivi/p/9832634.html
Copyright © 2020-2023  润新知