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中的闭包实例详解
Aug 29 Python
Python标准库内置函数complex介绍
Nov 25 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
Python按行读取文件的简单实现方法
Jun 22 Python
Python算法应用实战之队列详解
Feb 04 Python
Python实现的下载网页源码功能示例
Jun 13 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
python小白切忌乱用表达式
May 29 Python
keras 多gpu并行运行案例
Jun 10 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
Python读取和写入Excel数据
Apr 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实现singleton()单例模式实例
2014/11/06 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
2018/09/19 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
解决Python一行输出不显示的问题
2018/12/03 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
写好自荐信的几个要点
2013/12/26 职场文书
建设工地安全标语
2014/06/07 职场文书
团日活动总结报告
2014/06/25 职场文书
2014年学生工作总结
2014/11/20 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
博士论文答辩开场白
2015/06/01 职场文书
天堂的孩子观后感
2015/06/11 职场文书
全民创业工作总结
2015/08/13 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers