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 23 Python
python修改字典内key对应值的方法
Jul 11 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
分享6个隐藏的python功能
Dec 07 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
python数据挖掘需要学的内容
Jun 23 Python
详解python内置常用高阶函数(列出了5个常用的)
Feb 21 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 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 fsockopen函数被禁用的解决办法
2013/08/07 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
激活 ActiveX 控件
2006/10/09 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
技校教师求职简历的自我评价
2013/10/20 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
绩效考核实施方案
2014/03/18 职场文书
年度考核表个人总结
2015/03/06 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
女儿满月酒致辞
2015/07/29 职场文书
党员廉政准则心得体会
2016/01/20 职场文书