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中数字以及算数运算符的相关使用
Oct 12 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
wxpython实现图书管理系统
Mar 12 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
Django框架模板用法入门教程
Nov 04 Python
python判断无向图环是否存在的示例
Nov 22 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
基于Python实现nc批量转tif格式
Aug 14 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
BootStrap模态框不垂直居中的解决方法
2017/10/19 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
python版微信跳一跳游戏辅助
2018/01/11 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
python文字转语音实现过程解析
2019/11/12 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
.NET程序员的数据库面试题
2012/10/10 面试题
大学四年职业生涯规划书范文
2014/01/02 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
环保标语口号
2014/06/13 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
python必学知识之文件操作(建议收藏)
2021/05/30 Python