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中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python pickle模块用法实例分析
May 27 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
Python数据报表之Excel操作模块用法分析
Mar 11 Python
python面向对象法实现图书管理系统
Apr 19 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
Python调用C语言程序方法解析
Jul 07 Python
Python eval函数原理及用法解析
Nov 14 Python
python安装sklearn模块的方法详解
Nov 28 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使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
php类自动加载器实现方法
2015/07/28 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
python中List的sort方法指南
2014/09/01 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python可以实现栈的结构吗
2020/05/27 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
护理专业学生的求职信范文
2013/12/11 职场文书
高中语文教学反思
2014/01/16 职场文书
优秀食品类广告词
2014/03/19 职场文书
小学生春游活动方案
2014/08/20 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
店面出租协议书范本
2014/11/28 职场文书
春季运动会开幕词
2015/01/28 职场文书
生日赠语
2015/06/23 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书