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删除指定类型(或非指定)的文件实例详解
Jul 06 Python
django框架如何集成celery进行开发
May 24 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 Python
pytorch 实现打印模型的参数值
Dec 30 Python
python编写俄罗斯方块
Mar 13 Python
Python集合的基础操作
Nov 01 Python
如何使用python包中的sched事件调度器
Apr 30 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 xml文件操作代码(一)
2009/03/20 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
jquery之Document元素选择器篇
2008/08/14 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
Underscore源码分析
2015/12/30 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python获取文件ssdeep值的方法
2014/10/05 Python
Python爬取三国演义的实现方法
2016/09/12 Python
python try except 捕获所有异常的实例
2018/10/18 Python
django 环境变量配置过程详解
2019/08/06 Python
pycharm运行scrapy过程图解
2019/11/22 Python
详解python 中in 的 用法
2019/12/12 Python
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
《水乡歌》教学反思
2014/04/24 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
送给客户微信问候语!
2019/07/04 职场文书
java代码实现空间切割
2022/01/18 Java/Android