全栈一路坑(4)——创建博客的API

上一篇博客:全站之路一路坑(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服务器的工具

填入相关的测试信息

然后得到了正确的结果

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

时间: 2024-12-08 04:24:26

全栈一路坑(4)——创建博客的API的相关文章

Django创建博客应用

最近在看一篇全栈增长工程师实战,然后学习里面的项目,结果发现作者用的技术太过老旧,好多东西都已经被抛弃了,所以结合着官方文档和自己的一些理解将错误的信息替换一下,边写边学习 准备工作和工具 作者说需要一些python基础,但是中国程序员是最好的程序员,没有基础照样看,大不了遇到不懂的现学就是喽 需要在计算机上安装一些工具 Python环境及包管理工具pip 一款浏览器,推荐Chrome,当然,用自己喜欢的浏览器也可以 版本控制,推荐用Git,但是很多培训机构出来的只会SVN,所以这个没有什么重要

走向全栈之坑—开始实践

走向全栈之坑-开始实践 (一)搭建云服务器-Ubuntu+MySQL(有经济能力的可选,其实也不贵,个人也推荐) (一)搭建本地虚拟机-Ubuntu+MySQL 1.安装Ubuntu 2.安装.net core 3.安装jexus 4..net core与jexus的结合 5.安装与配置MySQL (二)搭建中间层--ASP.Net Core WebApi 1.第一个webapi 2.webapi连接MySQL 3.相关数据模型(models)的创建 4.webapi说明及可能出现的问题 (三)

Django快速创建博客,包含了整个框架使用过程,简单易懂

创建工程                                                                                                           创建mysite工程项目: D:/djpy> django-admin.py startproject mysite 工程目录结构: manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等. settings.py ----

基于hexo创建博客(Github托管)

基于hexo的博客 搭建步骤 1.依赖文件下载 Node.js 2.Hexo的安装 3.部署到Github 4.Hexo创建博客基本操作 5.Hexo主题皮肤更换 依赖文件Node.js 首先要安装node,npm 前端支持的基础文件 npm包管理,使用cnpm下载速度更快 npm install -g cnpm --registry=https://registry.npm.taobao.org Hexo框架安装 1.框架安装 cnpm install -g hexo-cli 2.创建一个空文

Github-Hexo创建博客

环境准备 安装nodejs安装git 安装Hexo 打开cmd命令行,输入 1 2 3 4 5 D: cd D:/hexo npm install hexo-cli -g //卸载 npm uninstall hexo-cli 初始化Hexo 1 2 3 4 hexo init blog cd blog npm install #安装package.json中的依赖包 npm install hexo-deployer-git --save #安装deploy插件,用于部署到GitHub 测试运

iOS_CNBlog项目开发 (基于博客园api开发)

按照惯例, 先上效果图 前言 很巧, 做这个项目是因为刚好在逛博客园的时候看到一篇文章 博客园第三方客户端-i博客园正式发布App Store, 这里就帮忙贴下链接啦, 毕竟我是由此而想说做这个项目的. 然而更巧的是, 和那篇文章的作者一样, 我也是刚毕业要找实习的人了(/(ㄒoㄒ)/~~), 开发容易找工不易, 哎, 做个项目练练手吧. 然后, 整个项目做下来大概做了半个月吧, 今天算是做出1.0版本啦, 已经贴上github(https://github.com/samAroundGitHu

初试Nodejs——使用keystonejs创建博客网站1(安装keystonejs)

我正在阿里云上创建一个简单的个人博客网站,刚好正在尝试NodeJs,决定找一款基于NodeJs的CMS来完成这个工作,最后找到了KeyStoneJS. KeyStoneJS是基于Express和MongoDB的CMS架构,详细介绍参见官网http://keystonejs.com/zh/.本文记录一下keystonejs的安装过程,后续将记录基于keystonejs的二次开发过程. keystonejs的安装过程并不复杂,但由于涉及到node.js,MongoDB,yo等安装,如果某一步陷到坑里

创建博客来记录我每天的java征途

大家好! 今天2015-7-29!我创建了属于我自己的博客,在这里,我将记录我每天的java学习征途, 其实我的大学专业不是软件工程类的,而是建筑工程,都是工程,可是两者之间却完全不沾边的两个专业,为什么我会选择放弃我的大学专业学习java呢? 第一点:虽说我在大学的专业是建筑工程,可是大学里我都是浑浑噩噩度过的,没有学到什么东西,每天呆在寝室和室友一起玩游戏,可以说大学三年基本是玩过来的,可是我大学每次期末考都没有挂过科,当然,每次考试前总是会抱抱佛脚,还算幸运,没有挂科. 第二点:java挣

Djanjo创建博客

拜读http://www.cnblogs.com/fnng/p/3737964.html 后自操作步骤,mark一下 我的想法: modles.py中只负责添加类,定义数据结构,至于将该类添加到admin后台,应该交给admin.py处理. admin.py中importmodels中的类,然后再去处理. -------------------------------------------------------------------------------------------- 版本信