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抓取网页图片并放到指定文件夹
Apr 24 Python
Python的Django框架中settings文件的部署建议
May 30 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
Python 判断奇数偶数的方法
Dec 20 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
python数据可视化使用pyfinance分析证券收益示例详解
Nov 20 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实现的MongoDB数据库操作类分享
2014/05/12 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
Django分页功能的实现代码详解
2019/07/29 Python
python实发邮件实例详解
2019/11/11 Python
详解python如何引用包package
2020/06/07 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
通信工程专业求职信
2014/06/04 职场文书
法人授权委托书
2014/09/16 职场文书
武夷山导游词
2015/02/03 职场文书
车间主任岗位职责
2015/02/03 职场文书
2015员工年度考核评语
2015/03/25 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server
Python中三种花式打印的示例详解
2022/03/19 Python
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL