目录标题
1.继承APIView后,请求对象requests每次请求都是一个新的request
2.data: POST, PUT, PATCH请求方式解析后的数据
3.原生django,put提交的数据在request.POST中是娶不到的
4.其他方法用起来和之前是一样的(method, FILES, path)
| 参数 | 功能 |
|---|---|
| data=None | 把字典,列表序列化成json格式字符串,放到http请求的body中,返回给前端 |
| status=None | http响应状态码,默认是200, 201 |
| headers=None | http的响应头,是字典格式:{‘name’: ‘zhang’} |
| template_name=None | 在浏览器中看到好看的页面,指定的模板 |
| content_type=None | 响应编码格式(json) |
其实在drf内置的配置文件中提前就配好了请求编码
drf配置文件settings.py中有DEFAULT_PARSER_CLASSES(默认的解析类)
'rest_framework.parsers.JSONParser', 可以解析json格式
'rest_framework.parsers.FormParser', 可以解析urlencoded格式
'rest_framework.parsers.MultiPartParser' 可以解析form-data格式
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
# 'rest_framework.parsers.FormParser',
# 'rest_framework.parsers.MultiPartParser',
],
}
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
class TestView(APIView):
parser_classes = [JSONParser,FormParser,MultiPartParser]
如果用浏览器接收响应,看到的是好看的页面,如果用postman,看到的是json格式
默认情况下,响应的编码是根据客户端类型决定的
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
# 'rest_framework.renderers.JSONRenderer', # json格式
'rest_framework.renderers.BrowsableAPIRenderer', #浏览器的格式
]
}
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
class TestView(APIView):
renderer_classes = [JSONRenderer,]
1.由于drf提供了一个顶层的视图类APIView,以后直接继承APIView写视图类即可
2.后期可以使用面向对象的继承,封装
1.APIView
2.GenericAPIView(继承了APIView)
3.方法:
| 方法 | 作用 |
|---|---|
| self.get_object() | 根据pk获取单个数据 |
| self.get_serializer() | 获取要使用的序列化类 |
| self.get_queryset() | 获取所有要序列化的数据 |
models.py
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32)
publish = models.CharField(max_length=32)
serializer.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
views.py
class BookView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(data=ser.data)
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class BookDetailView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
def put(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response({'code': 100, 'msg': '修改成功'})
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('ok')
urls.py
path('books/', views.BookView.as_view()),
path('books/<int:pk>/', views.BookDetailView.as_view()),
class CheckOne(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
class CheckAll(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(data=ser.data)
class AddOne(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class ChangeOne(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def put(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response({'code': 100, 'msg': '修改成功'})
class DeleteOne(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('ok')
class BookView(CheckAll, AddOne):
def __init__(self):
super(CheckAll, self).__init__()
super(AddOne, self).__init__()
class BookDetailView(CheckOne, ChangeOne, DeleteOne):
def __init__(self):
super(CheckOne, self).__init__()
super(ChangeOne, self).__init__()
super(DeleteOne, self).__init__()
class CheckOne:
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
class CheckAll:
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(data=ser.data)
class AddOne:
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class ChangeOne:
def put(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response({'code': 100, 'msg': '修改成功'})
class DeleteOne:
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('ok')
class BookView(GenericAPIView, CheckAll, AddOne):
queryset = Book.objects.all()
serializer_class = BookSerializer
def __init__(self):
super(CheckAll, self).__init__()
super(AddOne, self).__init__()
class BookDetailView(GenericAPIView, CheckOne, ChangeOne, DeleteOne):
queryset = Book.objects.all()
serializer_class = BookSerializer
def __init__(self):
super(CheckOne, self).__init__()
super(ChangeOne, self).__init__()
super(DeleteOne, self).__init__()
# Create your views here.
# 1:查看一条数据
class CheckOne:
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
# 2:查看所有数据
class CheckAll:
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(data=ser.data)
# 3.增加一条数据
class AddOne:
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
# 4:修改一条数据
class ChangeOne:
def put(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response({'code': 100, 'msg': '修改成功'})
# 5:删除一条数据
class DeleteOne:
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('ok')
# 6:查看所有+增加一条
class GetAllandPost(CheckAll, AddOne):
def __init__(self):
super(CheckAll, self).__init__()
super(AddOne, self).__init__()
# 7:查看一条+修改一条
class GetOneandPut(CheckOne, ChangeOne):
def __init__(self):
super(CheckOne, self).__init__()
super(ChangeOne, self).__init__()
# 8:查看一条+删除一条
class GetOneandDelete(CheckOne, DeleteOne):
def __init__(self):
super(CheckOne, self).__init__()
super(DeleteOne, self).__init__()
# 9:删除一条+修改一条
class DeleteandPut(DeleteOne, ChangeOne):
def __init__(self):
super(DeleteOne, self).__init__()
super(DeleteOne, self).__init__()
# class BookView(GenericAPIView, CheckAll, AddOne):
# queryset = Book.objects.all()
# serializer_class = BookSerializer
# def __init__(self):
# super(CheckAll, self).__init__()
# super(AddOne, self).__init__()
# class BookDetailView(GenericAPIView, CheckOne, ChangeOne, DeleteOne):
# queryset = Book.objects.all()
# serializer_class = BookSerializer
# def __init__(self):
# super(CheckOne, self).__init__()
# super(ChangeOne, self).__init__()
# super(DeleteOne, self).__init__()
class BookDetailView(GenericAPIView,GetOneandPut):
queryset = Book.objects.all()
serializer_class = BookSerializer
def __init__(self):
super(CheckOne, self).__init__()
super(ChangeOne, self).__init__()
class BookView(GenericAPIView, GetAllandPost):
queryset = Book.objects.all()
serializer_class = BookSerializer
def __init__(self):
super(GetAllandPost, self).__init__()
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)