python drf之viewset

What is Views drf提供了两个基类,五个视图扩展类,9个视图集 drf提供了一个Django中view的子类APIView ,主要变动大概为以下: 重新封装了Request 与 Response实例。 使用了独有的Request与Response对象,并且提供了专有的解析器 Parser 可以根据HTTP Content-Type 指明的请求数据进行解析。 增加了自有的鉴权/节流 在django中dispatch() 分发前,会对请求进行身份认证、权限检查、流量控制。 异常捕获 APIException。 APIView implement python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 @classmethod def as_view(cls, **initkwargs): .... # 调用父类的方法,Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx view = super(APIView, cls).as_view(**initkwargs) view.cls = cls # 并且生成一个新的request view.initkwargs = initkwargs # Note: session based authentication is explicitly CSRF validated, # all other authentication is CSRF exempt....

 ·  · 

python drf之Serializer

What is serializers? serializers主要作用是将原生的Python数据类型(如 model querysets )转换为web中通用的JSON,XML或其他内容类型。 DRF 提供了一个Serializer类,它为您提供了种强大的通用方法来控制响应的输出,以及一个ModelSerializer 类,它为创建处理 model instance 和 serializers 提供了一个序列化的快捷方式。 Reference drf serializers manual How to Declaring Serializers? 序列化一个django model python 1 2 3 4 5 6 7 class Comment: def __init__(self, email, content, created=None): self.email = email self.content = content self.created = created or datetime.now() comment = Comment(email='leila@example.com', content='foo bar') 声明Serializers,可以用来序列化与反序列化对象 Comment的属性及值。 python 1 2 3 4 5 6 from rest_framework import serializers class CommentSerializer(serializers....

 ·  · 

python django使用

路由匹配 django中默认匹配页 text 1 url(r'^$', views.login), django中404匹配 text 1 url(r'^$', views.login), # 需要放置最后,不过一般不推荐,都是通过异常捕获处理 named group 名称组 https://docs.djangoproject.com/en/1.11/topics/http/urls/#named-groups text 1 url(r'^test[0-9]{4}',views.login) 反向解析 别名不能出现冲突 text 1 2 from django.shortcuts import reverse reverse(xxx) 名称组反向解析 无名分组 python 1 2 3 4 5 6 # 路由部分 url(r'^index/(\d+)/', views.home, name='xxx') # 前端 <a href="{% url 'id' obj.id %}" class="btn btn-primary btn-xs">remove</a>s # 后端 print reverse('id', args=(id,)) 有名称分组 python 1 2 3 4 5 6 7 8 # 路由部分 url(r"^userdel/(?...

 ·  · 

django ORM

https://www.cnblogs.com/Dominic-Ji/p/11516152.html 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 django中仅测试ORM 导入model,然后直接使用对应对象进行ORM操作。 text 1 2 3 4 5 6 7 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") import django django.setup() from xxx import models models.User.objects.all() 连接数据库 django配置数据库 python 1 2 3 4 5 6 7 8 9 10 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER': 'root', 'PASSWORD': '111', 'HOST':'127.0.0.1', 'NAME': 'book', 'CHARSET': 'utf8' } } 可选:pymysql 使用模块连接MySQL数据库::在项目中__init__.py 文件中添加配置: python 1 2 import pymysql pymysql....

 ·  · 

由PIPE size 引起的线上故障

sence:python中使用subprocess.Popen(cmd, stdout=sys.STDOUT, stderr=sys.STDERR, shell=True) ,stdout, stderr 为None. 在错误中执行是无法捕获 stderr的内容,后面将上面的改为 subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True),发现是可以拿到 stderr, 但是会遇到大量任务hanging,造成线上事故。 为此特意查询subprocess的一些参数的说明。 stdin stdout stderr 如果这些参数为 PIPE, 此时会为一个文件句柄,而传入其他(例如 sys.stdout 、None 等)的则为None 正如这里介绍的一样,subprocess 。 而使用 PIPE,却导致程序 hanging。一般来说不推荐使用 stdout=PIPE stderr=PIPE,这样会导致一个死锁,子进程会将输入的内容输入到 pipe,直到操作系统从buffer中读取出输入的内容。 查询手册可以看到确实是这个问题 Refernce Warning This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that....

 ·  ·