上一篇博客:全站之路一路坑(3)——使用百度站长工具提交站点地图

这一篇要搭建一个API平台,一是为了给博客补充一些功能,二是为以后做APP提供数据接口。

首先需要安装Django REST Framework的RESTful API库,记得先打开virtualenv,避免全局污染。

pip install djangorestframework

然后添加到INSTALLED_APPS中

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blogpost',
'django.contrib.sites',
'django.contrib.flatpages',
'django_comments',
'django.contrib.sitemaps',
'rest_framework',
]

然后添加url

urlpatterns = [
url(r'^$', 'blogpost.views.index', name='main'),
url(r'^index.html$', 'blogpost.views.index', name='main'),
url(r'^blog/(?P<slug>[^\.]+).html', 'blogpost.views.view_post', name='view_blog_post'),
url(r'^admin/', admin.site.urls),
url(r'^pages/', include('django.contrib.flatpages.urls')),
url(r'^comments/', include('django_comments.urls')),
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

准备工作完成,先来创建一个博客列表的API,在blogpost下面创建一个serializers.py的文件。BlogpostSet用来定义视图的展现形式,返回需要展示的内容,BlogpostSerializers用户定义API的表现形式,返回哪些字段,返回怎样的格式

from django.contrib.auth.models import User
from rest_framework import serializers, viewsets
from blogpost.models import Blogpost class BlogpostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Blogpost
fields = ('title', 'author', 'body', 'slug') class BlogpostSet(viewsets.ModelViewSet):
queryset = Blogpost.objects.all()
serializer_class = BlogpostSerializer

然后配置url,添加

from django.conf.urls import url, include
from django.contrib import admin
from django.contrib.sitemaps.views import sitemap
from sitemap.sitemaps import PageSitemap, FlatPageSitemap, BlogSitemap
from rest_framework import routers
from blogpost.serializers import BlogpostSet sitemaps = {
"page": PageSitemap,
'flatpages': FlatPageSitemap,
'blog': BlogSitemap
} apiRouter = routers.DefaultRouter()
apiRouter.register(r'blogpost', BlogpostSet) urlpatterns = [
url(r'^$', 'blogpost.views.index', name='main'),
url(r'^index.html$', 'blogpost.views.index', name='main'),
url(r'^blog/(?P<slug>[^\.]+).html', 'blogpost.views.view_post', name='view_blog_post'),
url(r'^admin/', admin.site.urls),
url(r'^pages/', include('django.contrib.flatpages.urls')),
url(r'^comments/', include('django_comments.urls')),
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api/', include(apiRouter.urls)),
]

然后访问http://127.0.0.1:8000/api/

点击链接之后就可以看到博客列表的API了

自动完成API

自动完成API其实就是一个搜索接口,首先修改一下博客API,添加了一个搜索字段search_fields,指向title

from django.contrib.auth.models import User
from rest_framework import serializers, viewsets, permissions
from rest_framework.response import Response from blogpost.models import Blogpost class BlogpostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Blogpost
fields = ('title', 'author', 'body', 'slug') class BlogpostSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
serializer_class = BlogpostSerializer
search_fields = 'title' def list(self, request):
queryset = Blogpost.objects.all()
search_param = self.request.query_params.get('title', None)
if search_param is not None:
queryset = Blogpost.objects, filter(title__contains=search_param)
serializers = BlogpostSerializer(queryset, many=True)
return Response(serializers.data)

然后测试报错了

作者的代码又一次出错了,修改代码如下

from django.contrib.auth.models import User
from rest_framework import serializers, viewsets, permissions
from rest_framework.response import Response from blogpost.models import Blogpost class BlogpostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Blogpost
fields = ('title', 'author', 'body', 'slug') class BlogpostSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
serializer_class = BlogpostSerializer
search_fields = 'title' def get_queryset(self):
return Blogpost.objects.all() def list(self, request):
queryset = Blogpost.objects.all()
search_param = self.request.query_params.get('title', None)
if search_param is not None:
queryset = Blogpost.objects.filter(title__contains=search_param)
serializers = BlogpostSerializer(queryset, many=True)
return Response(serializers.data)

然后就是一段前端的工作了,由于我直接把前端代码拷贝过来了,所以直接能用了

然后就是每一个做API都头疼的问题了,跨域问题

首先添加django-cors-headers

pip install django-cors-headers

然后注册它

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blogpost',
'django.contrib.sites',
'django.contrib.flatpages',
'django_comments',
'django.contrib.sitemaps',
'rest_framework',
'corsheaders',
]

还要注册中间件

MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
'corsheaders.middleware.CorsMiddleware',
]

然后在settings.py中再添加对应的配置

CORS_ALLOW_CREDENTIALS = True

上传完代码之后测试一下,pycharm自带了一个很方便的测试restful服务器的工具

填入相关的测试信息

然后得到了正确的结果

至此,服务端的开发工作暂时就告一段落了,下一篇将开始移动端的开发。

最新文章

  1. C算法编程题(五)“E”的变换
  2. Extjs 源码组成(4.0.7)
  3. [源码解析]HashMap和HashTable的区别(源码分析解读)
  4. poj1019_Number_Sequence
  5. PAT IO-02 整数四则运算
  6. java线程安全和线程同步
  7. Adding an On/Off switch to your Raspberry Pi
  8. 【javascript模式】Chapter2: 基本 技巧
  9. 基于IAP和Keil MDK的远程升级设计
  10. 洛谷P3655 差分数组 树状数组
  11. 深入浅出Java反射
  12. mac系统删除.DS_Store文件
  13. 启动elasticsearch报错
  14. idea not found for the web module
  15. linux system()函数详解
  16. h5实现手机端等级进度条
  17. Xcode command line tools
  18. 小白扫盲:Android 设备的CPU类型(通常称为”ABIs”)
  19. 使用import取代require
  20. 释放Ubuntu/Linux系统cache,增加可用内存空间

热门文章

  1. laravel5.2总结--数据迁移
  2. 使用 CommandScene 类在 XNA 中创建命令场景(十二)
  3. 第九届极客大挑战 部分WP
  4. Windows下Eclipse安装PyDev
  5. Shell脚本编程
  6. PHP PDO fetch() 详解
  7. Hadoop第三课
  8. 【homework week5】初步了解敏捷开发——自由与约束的哲学统一
  9. Ognl对象图导航语言 源码
  10. 【两种方式 Service References和 web References 】手把手教你引入webservice 服务