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 09 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
python实现感知器
Dec 19 Python
pandas series序列转化为星期几的实例
Apr 11 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
关于Numpy中的行向量和列向量详解
Nov 30 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
Python 中Operator模块的使用
Jan 30 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
Apache设置虚拟WEB
2006/10/09 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
node.js require() 源码解读
2015/12/13 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
Python算法之栈(stack)的实现
2014/08/18 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
python实现对输入的密文加密
2019/03/20 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
Python使用Matlab命令过程解析
2020/06/04 Python
《美丽的小路》教学反思
2014/02/26 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2015高考寄语集锦
2015/02/27 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang