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 相关文章推荐
详解python3百度指数抓取实例
Dec 12 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
对python中的pop函数和append函数详解
May 04 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python实现文件的备份流程详解
Jun 18 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
Django model update的多种用法介绍
Mar 28 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
浅析python中的del用法
Sep 02 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在window iis的莫名问题的测试方法
2013/05/14 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
匹配任意字符的正则表达式写法
2010/04/29 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
js 图片懒加载的实现
2020/10/21 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
Python模块的加载讲解
2019/01/15 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Python面向对象进阶学习
2019/05/21 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
python上selenium的弹框操作实现
2020/07/13 Python
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
EJB与JAVA BEAN的区别
2016/08/29 面试题
装修五一活动策划案
2014/01/23 职场文书
单位成立周年感言
2014/01/26 职场文书
书法比赛获奖感言
2014/02/10 职场文书
《分一分》教学反思
2014/04/13 职场文书
教室布置标语
2014/06/26 职场文书
学校开除通知书
2015/04/25 职场文书
采购部年度工作总结
2015/08/13 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python