Django 初认识。mac使用Django搭建后台服务器并加加实时报道功能。

前言

新近发出只对象说他每天劳作经常都如翻开某些官方网站的打招呼,一看就是十几独网站,每个网站来回切,很是苦恼,于是咨询我产生没有发出较elegant
的解决办法。作为一个程序员,能因此代码解决的不用动手。起初是故Python
写了个简单的本子,通过爬取这些网站的打招呼,再经目录的款式显得出,方便查看。

而当一个iOS 开发,考虑做成个App
来查看更为有利,顺带着吧仿照下后端平的学问,自己写单API,搭建筑个服务器啥的。经调研打算先由Django
入手。Django 是运 Python 编写的一个开源 Web
框架,可以为此其来很快增加建筑一个胜似性能的网站。本文先称个门户,Let’s do it!

立马篇文章介绍如何通过Django框架搭建筑一个后台,实现接口编写、实时报道以及推送功能。

1.多建筑环境

本人用的工具:
PyCharm
用于编写代码,破解方法在这边,如果坏请自行检索另外方破解
Postman
用于测试接口
mysql
服务器数据库操作自选用的凡mysql,不过本文不打算讲数据库的东西,可以免作伪

安装pip

sudo easy_install pip

攻过程中参阅链接:
廖雪峰Python教程,学习Python的基本使用
菜鸟教程,学习环境的搭建以及下,本文主要内容

安装Django

sudo pip install Django==1.11

万一顾的是如基于自己的Python 版本选择相应之Django 版本,python
版本对许提到

建议安装好我面提到的工具,还有地方菜鸟教程的始末和本文编写接口功能为主类似,可以一直参考该链接。还有Django是急需事先安装之,我是通过pip3
install django进行设置之,安装详细教程也堪参考菜鸟教程上。

安装Django REST framework

sudo pip install djangorestframework

开始

率先新建一个路,打开终端cd到一个目录下,执行语句既可创一个Django项目,helloworld表示项目文件称,可自从定义

$ cd desktop
$ django-admin.py startproject helloworld

图片 1

文件内容

目录说明:

  • hellowrold:项目容器
  • manage.py:命令行工具,可以为你通过命令行与该Django交互。比如数据库操作
  • hellowrold/init.py: 一个空文件,告诉 Python 该目录是一个 Python
    包。不常使用可是要的
  • hellowrold/settings.py: 该 Django 项目的装/配置。经常采取
  • hellowrold/urls.py: 该 Django 项目之 URL 声明; 一客由 Django
    驱动之网站”目录”。可以作为是后台api接口
  • hellowrold/wsgi.py: 一个 WSGI 兼容的 Web
    服务器的输入,以便运行而的种。没因此过

2.跑起来

新建一个app

cd这个项目,创建一个app,app名为example,表示该类型的一个分

python manage.py startapp example

然后在setting文件的INSTALLED_APPS里添加 ‘example’

图片 2

屏幕快照 2018-01-10 15.48.28.png

创建项目

django-admin startproject apiproject

启动服务器

1.之所以pycharm打开该型,右上角-file-open,此时以pycharm上运行(run)成功。

2.要么在极端(teminal) cd
到该helloworld文件路径,通过输入指令来启动服务器,这个路子而小心不要弄错,要确定是manage.py文件的目

$ cd 路径/hellowrold
$ python manage.py runserver 0.0.0.0:8000  //8000指的是端口号,不说明的情况下为8000,也可以自行修改

然即便开动了服务器,打开浏览器输入127.0.0.1:8000即可看出It
worked!
,说明服务器启动成功。

运行Web 服务

python manage.py runserver

于浏览器输入 http://127.0.0.1:8000/ ,看到如下的页面提示信息

屏幕快照 2017-12-29 下午3.24.55.png

让四邻设备呢克上到本机的服务器

通过pycharm运作启动的服务器,只能当本机上查看相,即在浏览器上输入127.0.0.1:8000,而同网络下的无绳电话机或微机都爱莫能助查看,要受四邻设备呢克入,必须使用极限(terminal)的措施启动服务器,terminal除了上面的不二法门外,在pycharm内啊闹一个Terminal选项,在那边执行命令也堪。

图片 3

屏幕快照 2018-01-10 13.54.17.png

接下来还有关键之一些,在品种中找到setting.py,在其中的’ALLOWED_HOSTS =
[]’中上加本机的IP地址,如

ALLOWED_HOSTS = ['127.0.0.1',
                 '192.168.0.1']

本机IP地址以系偏好设置-网络被视。

今天,只要与本机在同一网络下的设备,都得以经过浏览器上及我们的服务器被了。

改语言

settings.py

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'

改为

# 把英文改为中文
LANGUAGE_CODE = 'zh-hans'

# 把国际时区改为中国时区
TIME_ZONE = 'Asia/Shanghai'

刷新下

屏幕快照 2017-12-29 下午4.30.41.png

品味写一个接口

打开example目录下views.py文件,填写内容

from django.http import HttpResponse,JsonResponse

def hello(request):
    return HttpResponse('hello world')  //返回普通文本数据
    # return JsonResponse({'data':'response'})  //返回json格式数据

点代码应该好明,在尽hello函数的时节回来一截内容,其中要用回到json格式的情,需要导入JsonResponse

然后在urls.py中添加

from django.conf.urls import url
from django.contrib import admin

import example.views as views  

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^helloworld/hello', views.hello),
]

import example.views as views 导入example的views文件,以views来命名
url(r’^helloworld/hello’, views.hello)
新建一个接口也hello/hello的API,此时访127.0.0.1:8000/helloworld/hello即可见到返回值

3.创建应用APP

写一个get接口

下一场就是得把多几独接口进行测试,现在尝试写一个get请求的接口,同样是当view文件里编写接口函数,然后在urls文件中定义接口路径

def get_test(request):
    if request.method == 'GET':
        return HttpResponse('接收到get请求')

    return HttpResponse('error')

urls.py文件

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^helloworld/hello', views.hello),
    url(r'^helloworld/get_test', views.get_test),
]

在意,urls.py中定义好接口路径,可能无见面即时见效,如果发现接口无效,可以品味再次被服务器。

创建

django-admin.py startapp api

写一个post接口

职位要一如既往

def post_test(request):
    if request.method == 'POST':
        title = request.POST.get('title','值为空时')
        return HttpResponse('接收到post请求,接收到值: ' + title)
    return HttpResponse('error')

url(r'^helloworld/post_test', views.post_test),

尚记上面提到的postman工具为,我们以浏览器是没辙测试post接口的,打开postman输入链接和带参,点击send即可发送post请求

图片 4

屏幕快照 2018-01-10 14.57.29.png

如果post不成功,一是csrf错误,请参考该链接,解决办法是于setting.py文件里注释掉
MIDDLEWARE的’django.middleware.csrf.CsrfViewMiddleware’即可

添加App

屏幕快照 2017-12-29 下午4.57.38.png

品写一个聊天室

服务器发了,接口也会了,现在将要学习怎么样增加建筑一个聊天室进行聊天。聊天室的实现自身是于欠简书链接中学习的。

在setting的INSTALLED_APPS下添加’channels’。

假设是首批使用pycharm,可能会见没有有仓房,如channels等,这样在导入库的小试牛刀会错,可以于Prederences-Project:helloworld-Project
Interpreter中添加必须的库即可导入。

继之继续以setting中补充加

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgiref.inmemory.ChannelLayer",
        'ROUTING': 'helloworld.routing.channel_routing',
    },
}

然即便配置好了报道的大路

于example目录下新建consumers.py文件,内容吧

from channels import Group
import json
from channels import channel_layers

def ws_connect(message):
    print('已连接客户端')
    Group('users').add(message.reply_channel)
    message.reply_channel.send({
        'text': json.dumps({
            'msg': u"你好,很高兴为你服务。",
            'talk': False
        })
    })

def ws_disconnect(message):
    print('与客户端断开连接')
    Group('users').discard(message.reply_channel)

def ws_receive(message):
    print('接收到客户端发来的消息')
    data = json.loads(message['text'])
    message.reply_channel.send({
        'text': json.dumps({
            'msg': u"我正在思考你的问题{%s}" % data["text"],
            'talk': True
        })
    })

此地是channels通讯的老三个函数,连接客户端、断开客户端与收受客户端发送的音信。

紧接着开一个HTML页面用于测试,在example目录下新建templates文件,在其间继续新建一个example的文件,在里边新建一个chat.html,内容如下

图片 5

屏幕快照 2018-01-10 15.59.25.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test Django Channels</title>
</head>
<body>
<div style="text-align: center;margin-top: 50px">
    <input id="message" type="text" style="width: 300px" placeholder="输入消息">
    <button id="send-message" style="width:80px;margin-left:20px;">发送</button>
</div>
<table id="show-message" style="width: 410px;margin: 0 auto;margin-top: 10px">
    <tr>
        <td style="text-align: center; border-bottom:1px dashed #000;"><strong>聊天记录</strong></td>
    </tr>
</table>
</body>
<script src="//code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
    var socket = new WebSocket('ws://' + window.location.host + '/users/');
    if (socket.readyState == WebSocket.OPEN) {
        socket.onopen();
    }
    socket.onmessage = function (message) {
        var data = JSON.parse(message.data);
        updateLog("机器人", data["msg"]);
        $("#message").val("");
        $("#message").focus();
    };
    $("#send-message").click(function () {
        var inputText = $("#message").val();
        if (typeof(inputText) == "undefined" || inputText.length < 1) {
            alert("没有输入信息");
        }
        else {
            var msg = {"text": inputText};
            socket.send(JSON.stringify(msg));
            updateLog("你", inputText);
        }
    });
    function updateLog(name, message) {
        var chat = $("#show-message");
        var ele = "<tr><td>" + name + ": " + message + "</td></tr>"
        chat.append(ele);
    }
</script>
</html>

在views中添加

def chat_page(request):
    return render(request, 'example/chat.html')

在urls中添加

url(r'^helloworld/chat_page', views.chat_page),

这时候浏览器打开链接127.0.0.1:8000/helloworld/chat_page即可看到显示页面,尝试输入有值

图片 6

屏幕快照 2018-01-10 16.01.39.png

4.数据库模型

就聊天室

由此就得了聊天室的法力,现在解释一下刚刚的操作,我们于setting.py的INSTALLED_APPS中上加了channels,并且上加了CHANNEL_LAYERS配置通道路径,就是routing.py,routing里导入了consumers.py,我们于consumers里面纵使足以展开报道的操作了,在views里我们补充加了chat_page函数,该函数的企图是回调一个网页供浏览器展示。

在chat.html里发生只途径,var socket = new WebSocket(‘ws://’ +
window.location.host +
‘/users/’);因为channels是采取websocket进行报道的,所以路径头为ws://,后面接的/users/可以改,用于判断处理不同用户连接服务器,比如user1,那么在连续服务器的当儿即便会于consumers.ws_connect函数中获取到user1。

用户通讯时底效益就是一个聊天室,且机器人的复是message.reply_channel.send(),就是挨该通道返回,这样连无可知就多口报道。记得在ws_connect里的Group(‘users’).add(message.reply_channel)吗,这里表示Group的名为也’users’的组添加了该客户端的大路,可以视于断开连接时ws_disconnect该组进行了针对许通道的删除,我们可以经过此效应进行双人通讯或群组通讯,只要根据上面的user1的方式展开匹配即可。

创建model
from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100)
    url = models.CharField(max_length=200)

class Article(models.Model):
    title = models.CharField(max_length=200)
    date = models.CharField(max_length=50)
    url = models.CharField(max_length=200)
    category = models.ForeignKey(Category)

屏幕快照 2017-12-29 下午4.54.12.png

服务器进行iOS推送

所谓推送,可以是客户端正处于与劳动器端的连接过程中,服务器通过确立的报导管道展开信息推送,也堪是诸如微信那样,即便手机app被手动刷掉了,也会来一个信弹窗,这里虽说一下这种推送。

iOS有本土推送和网推送,关于网络推送我事先发生说过,链接以这边,建议先看一下及时首稿子,因为咱们要采用里面的推送证书,获取到关系后还得处理成pem格式,证书之博与拍卖得参照立篇稿子

搬数据库

相当给创造数量库表

python manage.py makemigrations

python manage.py migrate

证明处理

打钥匙串中将推送证书导出来后也.p12文件,通过极端以该转移为pem格式,现用该p12文本放到桌面上,假而该.p12文书称也mycert.p12

$ cd desktop
$ openssl pkcs12 -in mycert.p12 -out MyApnsCert.pem -nodes

现能够于桌面上抱到MyApnsCert.pem文件,将拖欠公文拖入到example目录下,这样证书处理就水到渠成了

开创 Admin 后台管理员账户

用于登录后台
python manage.py createsuperuser

丰富推送函数

还是在views.py上进行

率先需导入一个仓房,如果没有就随自者说的进行添加,以此库房底github地址

from apns2.client import APNsClient
from apns2.payload import Payload

def push_ios(request):

    token_hex = 'device token'
    payload = Payload(alert="Hello World!", sound="default", badge=1)
    topic = 'your bundle identifier'
    client = APNsClient('example/MyApnsCert.pem', use_sandbox=True, use_alternative_port=False)
    client.send_notification(token_hex, payload, topic)
    return HttpResponse('response')

device
token不用自身说了吧,知道网络推送的即使理解怎么抱,这个价值一般是在客户端连接上服务器之后发送给服务器,以供服务器进行推送用,服务器存储这同块本文就背着了。

payload里面带的凡内容,以json的格式发送,上面的数值在iOS设备及接的内容格式为

    aps =     {
        alert = "Hello World!";
        badge = 1;
        sound = default;
    };

topic 为iOS app的bundle id
client创建时留意路径问题,如果路径不对是碰头报错的,参数use_sandbox指开发模式,该token是生育模式时虽然反成为false

接下来形容好接口即可。

url(r'^helloworld/push_ios', views.push_ios),

调用后很快就可知顾手机收推送证书了。

当 Admin 后台注册模型
from django.contrib import admin
from .models import Category, Article

admin.site.register(Article)
admin.site.register(Category)

屏幕快照 2017-12-29 下午5.03.31.png

运转开发服务器,访问
http://127.0.0.1:8000/admin/
输入账号密码

屏幕快照 2017-12-29 下午5.04.02.png

结语

正文介绍了哪些通过Django框架搭建筑一个后台,并且实现了拉功能,支持双人聊天、群聊,以及针对iOS设备的音信推送功能,每一个效还花费了自不少工夫,写这首文章好扶持我梳理知识点,应该也会帮忙到用之总人口。

5.序列器(Serializers)

from .models import Article, Category
from rest_framework import serializers

class ArticleSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Article
        fields = ('title', 'date', 'url', 'category')

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = ('name', 'url')

屏幕快照 2017-12-29 下午5.47.23.png

6.视图(Views)

from .models import Article, Category
from rest_framework import viewsets
from .serializers import ArticleSerializer, CategorySerializer

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

屏幕快照 2017-12-29 下午5.50.49.png

7.URLs

from django.conf.urls import url, include
from rest_framework import routers
from django.contrib import admin
from api import views

router = routers.DefaultRouter()
router.register(r'articles', views.ArticleViewSet)
router.register(r'categorys', views.CategoryViewSet)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(router.urls)),
    # url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

屏幕快照 2017-12-29 下午5.51.22.png

8.测试API

http://127.0.0.1:8000/articles/

屏幕快照 2017-12-29 下午6.01.38.png

这会儿还从来不数,需要为数据库里补充加几长数据

屏幕快照 2017-12-29 下午5.52.37.png

此处来只问题输入中文后,后续添加修改会出现编码错误的页面
要在manager.py 添加这段代码就从不问题了

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

累加通告

屏幕快照 2017-12-29 下午6.04.19.png

屏幕快照 2017-12-29 下午6.05.21.png

再试一下,YES!鸡冻!

屏幕快照 2017-12-29 下午6.06.24.png

可是此地发现独稍题目,category字段应该只是归类的名字,我们转移下序列器,顺便把id
也长

class ArticleSerializer(serializers.HyperlinkedModelSerializer):
    category = serializers.ReadOnlyField(source='category.name')
    class Meta:
        model = Article
        fields = ('id', 'title', 'date', 'url', 'category')

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = ('id', 'name', 'url')

再试下

屏幕快照 2017-12-29 下午6.23.41.png

居功至伟告成!三只钟头之果实,对于新手来说既坏爽朗了

后续

眼前只是当地服务,而且只有出一个API,之后会圆满再多之API,并且安排及阿里云的服务器上,先定下此微目标吧!生命在于折腾!

相关文章