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里大整数相乘相关技巧指南
Sep 12 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
python实现自动发送邮件
Jun 20 Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 Python
Python自动发送邮件的方法实例总结
Dec 08 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
在python中修改.properties文件的操作
Apr 08 Python
python 画条形图(柱状图)实例
Apr 24 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
Python中可变和不可变对象的深入讲解
Aug 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的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
FireFox中textNode分片的问题
2007/04/10 Javascript
代码生成器 document.write()
2007/04/15 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
layui导航栏实现代码
2017/05/19 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
Django 响应数据response的返回源码详解
2019/08/06 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
python 带时区的日期格式化操作
2020/10/23 Python
python爬取微博评论的实例讲解
2021/01/15 Python
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
node中使用shell脚本的方法步骤
2021/03/23 Javascript
优秀员工评优方案
2014/06/13 职场文书
暑期培训心得体会
2014/09/02 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
销售督导岗位职责
2015/04/10 职场文书
建党伟业观后感
2015/06/01 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis