Python采用Django制作简易的知乎日报API


Posted in Python onAugust 03, 2016

现在我主要教大家如何去实战,做一个简易的知乎日报API
首先你要熟悉django的基本用法,会写模型,会写视图函数,会配置url。

1.配置字符编码

因为我们等一下要使用中文,所以要先设好字符编码
在settings.py里将LANGUAGE_CODE设为'zh-CN'
然后添加这两行

FILE_CHARSET='utf-8'
DEFAULT_CHARSET='utf-8'

还要进入到数据库
依次输入

set character_set_client=utf8 ;
set character_set_connection=utf8 ;
set character_set_database=utf8 ;
set character_set_results=utf8 ;
set character_set_server=utf8 ;
set character_set_system=utf8 ;

设置完成之后,输入

show variables like 'character%';

Python采用Django制作简易的知乎日报API

对照一下结果是否是这样

2.然后开始写模型

class News(models.Model):
  created = models.DateTimeField(auto_now_add=True)
  title = models.CharField(max_length=100)
  image = models.CharField(max_length=100)
  theme_id =models.IntegerField()
  class Meta:
    ordering = ('created',)
  def __unicode__(self):
    return self.title

class NewsDetail(models.Model):
  news = models.ForeignKey(News)
  created = models.DateTimeField(auto_now_add=True)
  content = models.CharField(max_length=1000)
  image = models.CharField(max_length=99)
  class Meta:
    ordering = ('created',)
  def __unicode__(self):
    return self.news.title

这里不难理解,这里我分两层,第一层是概括,第二层是详细内容,然后以概括的作为外键
概括主要包含标题,配图地址和主题
详细内容包括内容和配图地址

3.将模式序列化

这是rest_framework非常强大的一点
在app里新建一个serializers.py,然后创建继承自ModelSerializer的类

from rest_framework import serializers
class NewsSerializer(serializers.ModelSerializer):
  class Meta:
    model = News
    fields = ('id', 'title', 'image', 'theme_id')

class NewsDetailSerializer(serializers.ModelSerializer):
  class Meta:
    model = NewsDetail
    fields = ('id', 'image', 'content')

model为模型,fields为你想要查询显示的字段

4.然后再写视图函数

rest_framework.renderers中的JSONRenderer可以将对象渲染为json形式的字符串

from rest_framework.renderers import JSONRenderer
class JSONResponse(HttpResponse):
  """
  用于返回JSON数据.
  """

  def __init__(self, data, **kwargs):
    content = JSONRenderer().render(data)
    kwargs['content_type'] = 'application/json'
    content='{"news":'+content+'}'
    super(JSONResponse, self).__init__(content, **kwargs)

我们在字符串外面在包一个news,这样获取比较方便

如何像知乎日报的那样获取最新的几个news呢

@csrf_exempt
def latest_news(request):
  """
  展示最新的10个news.
  """
  if request.method == 'GET':
    news = News.objects.all()[:10]
    serializer = NewsSerializer(news, many=True)
    return JSONResponse(serializer.data)

因为返回的是一个集合所以NewsSerializer的many参数要设为True

返回某个主题的前几个news

@csrf_exempt
def theme_news(request,theme_id):
  """
  展示某个主题的前10个news.
  """
  if request.method == 'GET':
    news=News.objects.filter(theme_id=theme_id)[:10]
    serializer = NewsSerializer(news, many=True)
    return JSONResponse(serializer.data)

返回某个id的news的详细内容

@csrf_exempt
def news_detail(request,news_id):
  """
  显示某个news的内容.
  """
  try:
    news = NewsDetail.objects.get(news_id=news_id)
  except Snippet.DoesNotExist:
    return HttpResponse(status=404)

  if request.method == 'GET':
    serializer = NewsDetailSerializer(news)
    # print serializer.data
    return JSONResponse(serializer.data)

这里获取的是单个对象所以不用加many参数

5.配置url

urlpatterns = [
  ...
  url(r'^api/4/news/latest$', latest_news),
  url(r'^api/4/news/theme/(?P<theme_id>[0-9]+)/$', theme_news),
  url(r'^api/4/news/(?P<news_id>[0-9]+)/$', news_detail),
]

括号包住的是要传入的参数,逗号后面的是匹配url成功后要执行的视图函数
括号里面有一些正则表达式,自己可以去百度搜一下怎么写

最后就可以把项目跑起来

效果如下

Python采用Django制作简易的知乎日报API
Python采用Django制作简易的知乎日报API
Python采用Django制作简易的知乎日报API

Python 相关文章推荐
Python之Web框架Django项目搭建全过程
May 02 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
Python reduce()函数的用法小结
Nov 15 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
python+opencv识别图片中的圆形
Mar 25 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
Tensorflow卷积神经网络实例
May 24 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
Python实现括号匹配方法详解
Feb 10 Python
python实现磁盘日志清理的示例
Nov 05 Python
利用Python实现图书超期提醒
Aug 02 #Python
Python正规则表达式学习指南
Aug 02 #Python
Python实现SMTP发送邮件详细教程
Mar 02 #Python
python logging 日志轮转文件不删除问题的解决方法
Aug 02 #Python
python中的字典使用分享
Jul 31 #Python
Python随机生成数据后插入到PostgreSQL
Jul 28 #Python
python3新特性函数注释Function Annotations用法分析
Jul 28 #Python
You might like
PHP 模板高级篇总结
2006/12/21 PHP
Smarty模板快速入门
2007/01/04 PHP
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
基于php编程规范(详解)
2017/08/17 PHP
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python字符转换
2008/09/06 Python
详解python的数字类型变量与其方法
2016/11/20 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Flask框架配置与调试操作示例
2018/07/23 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
Python序列类型的打包和解包实例
2019/12/21 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
如何使用PHP session
2015/04/21 面试题
餐饮业会计岗位职责
2013/12/19 职场文书
网吧消防安全制度
2014/01/28 职场文书
小学美术教学反思
2014/02/01 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
保研推荐信
2014/05/09 职场文书
创业计划书之花店
2019/09/20 职场文书
python xlwt模块的使用解析
2021/04/13 Python