Django 初識

前言

最近有個朋友說他每天工作時都要查看某些官方網站的通告,一看就是十幾個網站,每個網站來回切,很是煩躁,于是問我有沒有比較elegant 的解決辦法。作為一個程序員,能用代碼解決的絕不動手。起初是用Python 寫了個簡單的腳本,通過爬取這些網站的通告,再通過目錄的形式展示出來,方便查看。

但是作為一個iOS 開發(fā),考慮做成個App 來查看更為方便,順帶著也學下后端的知識,自己寫個API,搭建個服務器啥的。經調研打算先從Django 入手。Django 是使用 Python 編寫的一個開源 Web 框架,可以用它來快速搭建一個高性能的網站。本文先入個門,Let's do it!

1.搭建環(huán)境

安裝pip

sudo easy_install pip

安裝Django

sudo pip install Django==1.11

要注意的是要根據自己的Python 版本選擇對應的Django 版本,python 版本對應關系

安裝Django REST framework

sudo pip install djangorestframework

2.跑起來

創(chuàng)建項目

django-admin startproject apiproject

運行Web 服務

python manage.py runserver

在瀏覽器輸入 http://127.0.0.1:8000/ ,看到如下的頁面提示信息

屏幕快照 2017-12-29 下午3.24.55.png
修改語言

settings.py

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

改為

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

# 把國際時區(qū)改為中國時區(qū)
TIME_ZONE = 'Asia/Shanghai'

刷新下

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

3.創(chuàng)建應用APP

創(chuàng)建

django-admin.py startapp api

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

4.數據庫模型

創(chuàng)建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
遷移數據庫

相當于創(chuàng)建數據庫表

python manage.py makemigrations

python manage.py migrate

創(chuàng)建 Admin 后臺管理員賬戶

用于登錄后臺
python manage.py createsuperuser

在 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

運行開發(fā)服務器,訪問 http://127.0.0.1:8000/admin/
輸入賬號密碼

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

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

這里有個問題輸入中文后,后續(xù)添加修改會出現編碼錯誤的頁面
需要在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

但是這里發(fā)現個小問題,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

大功告成!三個小時的成果,對于新手來說已經很爽了

后續(xù)

目前只是本地服務,而且只有一個API,之后會完善更多的API,并且部署到阿里云的服務器上,先定下這個小目標吧!生命在于折騰!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容