閱讀375 返回首頁    go 阿裏雲 go 技術社區[雲棲]


號稱最為簡明實用的Django上手教程(下)

1 前景回顧

係統環境:WIN10 64bit 開發環境:sublime+Anaconda
數據庫:Mysql 5.6.17
語言:python3.5
框架:django1.11+Bootstrap
可視化工具:Highchart|Echarts|plotly|Bokeh(采用Echarts)

2 靜態文件配置操作

 (1)靜態static文件夾的配置。

在analysis文件夾下創建:analysis/static和analysis/templates文件夾,其中:

① static:包括,css,js,img,font,files等文件,使用時需要配置,頁麵開頭添加{% load static %}

② templates:包含web的html靜態頁麵,django1.10之後會默認識別

(2)打開xmjc_analysis/setting.py修改如下:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")

(3)打開xmjc_analysis/urls.py修改如下:

# 配置加載靜態頁麵
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'^index/$', analysis_views.index,name='index'),# 首頁
    
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

(4) 在基模板(後文詳細介紹)base頁麵開頭添加{% load static %}

 (5 )xmjc_analysis/views.py修改如下:

'''
第一個頁麵
author:白寧超
site:https://www.cnblogs.com/baiboy/
'''
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse
def index1(request):
    name = request.GET['name']
    return HttpResponse(u"歡迎"+name+",進入第一個Django頁麵!")

def index(request):
    '''項目統計分析平台主頁'''
    return render(request,'xmjc/index.html') # 首頁

然後在xmjc_analysis/urls.py下添加訪問

前端nav.html的超鏈接如下:

3 結合Bootstrap和頁麵模板前端設計

  (1)什麼是Bootstrap?

Bootstrap是一組用於網站和網絡應用程序開發的開源前端框架,包括HTML、CSS及JavaScript的框架,提供字體排印、窗體、按鈕、導航及其他各種組件及Javascript擴展,旨在使動態網頁和Web應用的開發更加容易。 Bootstrap是GitHub上麵被標記為“Starred”次數排名第二最多的項目。Starred次數超過105,000,而分支次數超過了47,000次。

ps:前端框架,所有的插件依賴於 jQuery。所以必須在插件文件之前引用 jQuery

----維基百科

(2)Bootstrap學習資料

① 官網下載地址:https://getbootstrap.com/
②  中文網下載地址:https://www.bootcss.com/
③ w3c學習網站:https://www.w3cschool.cn/bootstrap

(3)引入 Bootstrap

<!-- 引入 Bootstrap -->
<link href="https://apps.bdimg.com/libs/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet">
<!-- jQuery (Bootstrap 的 JavaScript 插件需要引入 jQuery) -->
<script src="https://code.jquery.com/jquery.js"></script>
<!-- 精簡版 -->
<link href="https://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<script src="//libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="//libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>

具體知識點總結參考文章:【前端知識十分鍾預覽之學習劄記

(4)基於Bootstrap的頁麵模板設計

①  base.html 可以視作母模板,其中包括:

{% load static %}   放在頁麵最頂層,用於識別靜態文件

<head></head>      放入的編碼和基本信息以及css文件(js文件放在頁麵尾部,提高用戶體驗)

側邊欄                     引用③文件,便於修改和管理。

<!-- 側邊欄 -->
<div  >
    {% include 'xmjc/nav.html' %}
</div>
<!-- /側邊欄 -->

頁麵內容設計       {% block content %}{% endblock %}占塊符號

<div >
         {% block content %}
             <p>此處為主要內容</p>
          {% endblock %}
</div>

(5)運行服務器訪問

頁麵效果:

至此,已經完成靜態頁麵的配置工作。

4 多數據庫配置聯合操作

(1)打開xmjc_analysis/setting.py,有一個默認的數據庫 default,我們可以再加一些其它的(這裏你可以調用Access、SQLServer、Oracle等),比如:

'''
配置Mysql數據庫
2017年7月26日16:40:38
白寧超
'''
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test123',
        'HOST':'localhost',
        'PORT':'3306',
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '數據庫名稱',
        'USER': '用戶名',
        'PASSWORD': '密碼',
        "HOST": "localhost", #本地
        'PORT':'3306',
    },
    'db2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '數據庫名稱',
        'USER': '用戶名',
        'PASSWORD': '密碼',
        "HOST": "服務器地址",
        'PORT':'3306',
    },
}
# use multi-database in django
DATABASE_ROUTERS = ['xmjc_analysis.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
    #'app_name':'database_name',
    'app1': 'db1',
    'app2': 'db2',
}

(2)在project_name文件夾中存放 database_router.py 文件,內容如下:

# -*- coding: utf-8 -*-
from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING


class DatabaseAppsRouter(object):
    """
    A router to control all database operations on models for different
    databases.

    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
    will fallback to the `default` database.

    Settings example:

    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
    """

    def db_for_read(self, model, **hints):
        """"Point all read operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        """Point all write operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """Allow any relation between apps that use the same database."""
        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    # for Django 1.4 - Django 1.6
    def allow_syncdb(self, db, model):
        """Make sure that apps only appear in the related database."""

        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(model._meta.app_label) == db
        elif model._meta.app_label in DATABASE_MAPPING:
            return False
        return None

    # Django 1.7 - Django 1.11
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        print(db, app_label, model_name, hints)
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

View Code

(3)使用操作

# 查詢
YourModel.objects.using('db1').all()
# 保存 或 刪除
user_obj.save(using='new_users')
user_obj.delete(using='legacy_users')
# 數據庫同步
python manage.py migrate --database=db2
# 數據導出
python manage.py dumpdata app2 --database=db2 > app2_fixture.json
python manage.py dumpdata auth > auth_fixture.json
# 數據庫導入
python manage.py loaddata app1_fixture.json --database=db1

5  數據挖掘與可視化技術

 (1)設計思路

調用Echarts進行可視化展示,其中數據來源於兩個部分,直接調用一方麵數據庫的結構化數據,另一個方麵分析處理非結構化數據。最終處理成json形式,最後結合ajax進行數據綁定展示。這裏【數據挖掘|文本處理技術】不詳細介紹,主要展示思想和流程。期望展示三個案例:柱形圖、餅形圖、數據表格。

(2)數據前台展示,使用表單需要添加{%csrf_token%}

(3)柱形圖案例展示

新建頁麵ksh.html,添加如下代碼

<!-- 為ECharts準備一個具備大小(寬高)的Dom -->
<div >
    <div   >
    </div>
</div>

js代碼:

/*
柱狀圖
白寧超
2017年8月4日17:20:42
 */
// 基於準備好的dom,初始化echarts圖表
var myChart = echarts.init(document.getElementById('test1'));
// 指定圖表的配置項和數據
var option = {
    title: {
        text: 'ECharts 入門示例'
    },
    tooltip: {},
    legend: {
        data:['銷量']
    },
    xAxis: {
        data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
    },
    yAxis: {
    },
    series: [{
        name: '銷量',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
    }]
};
// 使用剛指定的配置項和數據顯示圖表。
myChart.setOption(option);

json數據:上麵案例采用官方數據,隻需要配置data即可,這個data的json數據,你可以通過數據挖掘技術後文本或者數據庫梳理出綁定起來即可。如下所示:

def xmjf(request):
    lnav="項目經費統計" # 可視化主題
    lcontent = "這裏是可視化主題的描述->項目經費統計" # 可視化主題的描述

    data=[{"value": 55, "name": '優先55'},
         {"value": 70,  "name": '普通70'},
         {"value": 25,  "name": "緊急25"}]
    data1 = [{"keys":"襯衫", "values":5},
            {"keys":"羊毛衫", "values":20},
            {"keys":"雪紡衫", "values":36},
            {"keys":"褲子", "values":10},
            {"keys":"高跟鞋", "values":10},
            {"keys":"襪子", "values":20}]
    return render(request,'xmjc/xmjf.html',{'lnav':lnav,'lcontent':lcontent,'data':data,'data1':data1})

效果:

(4)扇形圖案例展示

新建頁麵ksh.html,添加如下代碼

<!-- 為ECharts準備一個具備大小(寬高)的Dom -->
<div >
    <div   >
    </div>
</div>

js代碼

/*
嵌套環形圖
白寧超
2017年8月4日17:21:03
 */
var myChart1 = echarts.init(document.getElementById('test2'));

option1 = {
    tooltip: {
        trigger: 'item',
        formatter: "{a} <br/>{b}: {c} ({d}%)"
    },
    legend: {
        orient: 'vertical',
        x: 'left',
        data:['直達','營銷廣告','搜索引擎','郵件營銷','聯盟廣告','視頻廣告','百度','穀歌','必應','其他']
    },
    series: [
        {
            name:'訪問來源',
            type:'pie',
            selectedMode: 'single',
            radius: [0, '30%'],

            label: {
                normal: {
                    position: 'inner'
                }
            },
            labelLine: {
                normal: {
                    show: false
                }
            },
            data:[
                {value:335, name:'直達', selected:true},
                {value:679, name:'營銷廣告'},
                {value:1548, name:'搜索引擎'}
            ]
        },
        {
            name:'訪問來源',
            type:'pie',
            radius: ['40%', '55%'],

            data:[
                {value:335, name:'直達'},
                {value:310, name:'郵件營銷'},
                {value:234, name:'聯盟廣告'},
                {value:135, name:'視頻廣告'},
                {value:1048, name:'百度'},
                {value:251, name:'穀歌'},
                {value:147, name:'必應'},
                {value:102, name:'其他'}
            ]
        }
    ]
};
myChart1.setOption(option1);

View Code

效果

 

(5)表格案例展示

 新建頁麵ksh.html,添加如下代碼

<!-- DATA TABLES -->
<div class="row">
    <div class="col-md-6">
        <!-- BOX -->
        <div class="box border green">
            <div class="box-title">
                <h4><i class="fa fa-table"></i>動態數據表格</h4>
                <div class="tools hidden-xs">
                    <a href="javascript:;" class="reload">
                        <i class="fa fa-refresh"></i>
                    </a>
                    <a href="javascript:;" class="collapse">
                        <i class="fa fa-chevron-up"></i>
                    </a>
                    <a href="javascript:;" class="remove">
                        <i class="fa fa-times"></i>
                    </a>
                </div>
            </div>
            <div class="box-body">
                <table id="datatable1" cellpadding="0" cellspacing="0" border="0" class="datatable table table-striped table-bordered table-hover">
                    <thead>
                        <tr>
                            <!-- hidden-lg/md/xs/sm -->
                            <th class="center">用戶名</th>
                            <th class="center">密碼</th>
                            <th class="center">郵箱</th>
                            <th class="center">權限</th>
                        </tr>
                    </thead>
                    <tbody id="tbody">
                        {%  for user in data %}
                        <tr class="gradeB">
                            <td class="center">{{ user.username }}</td>
                            <td class="center">{{ user.userpass }}</td>
                            <td class="center">{{ user.useremail }}</td>
                            <td class="center">{{ user.usertype }}</td>
                        </tr>
                        {% endfor %}
                    </tbody>
                    <tfoot>
                        <tr>
                            <th class="center">用戶名</th>
                            <th class="center">密碼</th>
                            <th class="center">郵箱</th>
                            <th class="center">權限</th>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
        <!-- /BOX -->
    </div>
</div>

View Code

效果

 

6 將項目上傳到github,進行項目管理

(1)下載:Git 各平台安裝包下載地址為:https://git-scm.com/downloads

pip install git-core

Windows 平台上安裝包下載地址:https://msysgit.github.io/

(2)使用:Windows版Git下載安裝,在開始菜單裏找到Git->Git Bash

(3)配置你的名字和Email地址。

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

(4)創建版本庫

$ cd /E //你指定的個人盤符
$ mkdir mygit //創建版本庫根目錄
$ cd mygit //進入版本庫目錄
$ pwd //查看當前路徑

(5) 將需要上傳的項目拷貝到版本庫即mygit裏麵,查看

(6)通過git init命令把目錄變成Git可以管理的倉庫

(7) mygit下創建xmjc_analysis,用命令git add告訴Git,把文件添加到倉庫

(8)用命令git commit提交到倉庫,-m本次提交的說明

(9)遠程連接倉庫

git remote add originbnc git@github.com:username/bncgit.git

(10)推送

git push -u originbnc master

(11)查看我的github

 

 自此,完成全部初級學習,擴展處讀者自行學習。

最後更新:2017-08-30 15:32:38

  上一篇:go  開發者論壇一周精粹(第十五期):Oracle發布多個Java漏洞更新-2017年7月
  下一篇:go  號稱簡明實用的Django上手教程