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中使用Queue和Condition进行线程同步的方法
Jan 19 Python
Python中装饰器高级用法详解
Dec 25 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
python list格式数据excel导出方法
Oct 31 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
Python sqlite3查询操作过程解析
Feb 20 Python
Flask缓存静态文件的具体方法
Aug 02 Python
python绘制分布折线图的示例
Sep 24 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 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 第二节 数据类型之数组
2012/04/28 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
浅析PHP开发规范
2018/02/05 PHP
刷新页面实现方式总结(HTML,ASP,JS)
2008/11/13 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
Python输出9*9乘法表的方法
2015/05/25 Python
python实现自动登录
2018/09/17 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
学习和使用python的13个理由
2019/07/30 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
财务与信息服务专业推荐信
2013/11/28 职场文书
药店主任岗位责任制
2014/02/10 职场文书
校园元旦活动总结
2014/07/09 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
小学母亲节活动总结
2015/02/10 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python