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中使用正则表达式的方法
Aug 13 Python
详解python之配置日志的几种方式
May 22 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
详解如何减少python内存的消耗
Aug 09 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
Pytorch evaluation每次运行结果不同的解决
Jan 02 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
Python自动化操作实现图例绘制
Jul 09 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
Django创建一个后台的基本步骤记录
Oct 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循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
python图像处理之镜像实现方法
2015/05/30 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
python读取二进制mnist实例详解
2017/05/31 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
python+pygame实现坦克大战
2019/09/10 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
PHP笔试题
2012/02/22 面试题
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
怎么样写好简历中的自我评价
2013/10/25 职场文书
合作投资意向书
2014/04/01 职场文书
2015个人简历自我评价语
2015/03/11 职场文书