Django搭建管理平台

原创 2016年08月29日 16:45:25

搭建Mac(linux)下Django框架

安装python3.5

注意:django的最新版本必须依赖python3。
mac下原先的python版本比较老2.7版本的,上官网直接下载python3.5 mac版本。

安装 pip

python3.5有自带的pip3和pip3.5,直接更新下就有pip了
linux下如果没有权限需要指定路径,–prefix=newpath。

pip3.5 install --upgrade pip
路径/pip3.5 install --upgrade pip

或者

pip3 install --upgrade pip
路径/pip3.5 install --upgrade pip

或者

pip install --upgrade pip
路径/pip3.5 install --upgrade pip

安装virtualenv

Mac:

pip install virtualenv

Linux:

路径/pip install virtualenv

注意:pip install完成后可能需要重启iterm2。

Mac:

virtualenv --python=`which python3` ~/.virtualenvs/djangodev

注:python2的就是which python2,可以创建python2的沙河环境,前提是需要安装python2。

Linux:

virtualenv --python=`pwd`/python3 ~/.virtualenvs/djangodev
source ~/.virtualenvs/djangodev/bin/activate

或者

. ~/.virtualenvs/djangodev/bin/activate

离开虚拟环境:

deactivate

安装Django

pip install Django

检查Django是否安装

输入

python -m django --version

如果有版本号,说明django成功安装

创建工程

官网的实例(mysite):

django-admin startproject mysite

启动server

直接启动的python默认server:

python manage.py runserver
python manage.py runserver 8080

居然可以监测其他机器上端口8080:

python manage.py runserver 0.0.0.0:8000

创建app

app和project的区别,摘自官网

An app is a Web application that does something – e.g., a Weblog system, a database of public records or a simple poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects.

官网上的实例polls:

python manage.py startapp polls

创建新的view并设置路由

参照官网tutorial01:
https://docs.djangoproject.com/en/1.10/intro/tutorial01/

Django连mysql

官网上教程默认是连接sqlite的,需要改成mysql。注意python2是用mysql-python的包,python3是用pymysql:

pip install pymysql

在/mysite/mysite/init.py中加入

import pymysql
pymysql.install_as_MySQLdb()

/mysite/mysite/settings.py中改配置:

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'cloud_api',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123817', #你的数据库密码
        'HOST': '180.76.144.167', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }
}

建立数据库中的表和数据

python manage.py migrate

使用Django的admin

使用管理工具

首先需要创建超级账户:

python manage.py createsuperuser
Username (leave blank to use 'root'): baidu
Email address: zhangliyuan01@baidu.com
Password:
Password (again):
Superuser created successfully.

浏览器输入:http://localhost:8000/admin
可以进入admin系统

创建model

参照官网的guide
/mysite/polls/models.py:

from django.db import models
# Create your models here.
class Resource(models.Model):
    # id = models.IntegerField()
    user_id = models.CharField(max_length=255)                         
    service_id =  models.CharField(max_length=255)
    instance_id = models.CharField(max_length=255)
    class Meta:
        db_table = 'resource'

使用admin管理model

使用官网的样例app:polls
使用之前创建的model:Resource
我们需要注册该数据模型到admin:

/mysite/polls/admin.py中

from django.contrib import admin

# Register your models here.
from polls.models import Resource

admin.site.register(Resource)

/mysite/mysite/settings.py中

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',
]

需要把polls注册进安装的app中。

自动生成所有model

python manage.py inspectdb > models.py
python manage.py inspectdb > models.py --database=esapis

其中第一句是生成默认数据库的models,第二句是esapis库的models。
名字根据settings里定:

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cloud_api',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123817', #你的数据库密码
        'HOST': '180.76.144.167', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
        # 'NAME': 'cloud_api',    #你的数据库名称
        # 'USER': 'cloud_api_w',   #你的数据库用户名
        # 'PASSWORD': 'zISD5tG_UNmDxDqy', #你的数据库密码
        # 'HOST': '10.180.112.24', #你的数据库主机,留空默认为localhost
        # 'PORT': '6208', #你的数据库端口
    },
    'esapis' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mis_es',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123817', #你的数据库密码
        'HOST': '180.76.144.167', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }
}

UI

https://github.com/geex-arts/django-jet

使用Django的restful支持

参照django-rest的官网:http://www.django-rest-framework.org/

安装

pip install djangorestframework
pip install markdown       
pip install django-filter  

'rest_framework'加入INSTALLED_APPS中

INSTALLED_APPS = (
    ...
    'rest_framework',
)

If you’re intending to use the browsable API you’ll probably also want to add REST framework’s login and logout views. Add the following to your root urls.py file.

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

Note that the URL path can be whatever you want, but you must include ‘rest_framework.urls’ with the ‘rest_framework’ namespace. You may leave out the namespace in Django 1.9+, and REST framework will set it for you.

处理put请求

from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.response import Response

@api_view(['PUT'])
def operService(request, accoutId, service, resourceId):
    """ 启动或者停止服务,valid=true """
    params = request.GET
    option = params.__getitem__("action")

    # print(request.data)
    # queryDict类型
    # print(request.data.__getitem__("region"))

    user = Users.objects.filter(user_id=accoutId)
    ...
    status=status.HTTP_400_BAD_REQUEST)

更改rest的认证和权限类

必须改这个类,否则需要在header里面带额外信息
之前一直报错:

“detail”: “CSRF Failed: CSRF token missing or incorrect.”

mysite/settings中:

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
}

遇到的问题

修改django_jet的数据库表字段名称

需要修改django_jet的数据库表字段名,如何改?
因为百度的数据库中不允许有’column’,’order’这种字段,所以我改成了'dj_column''dj_order',如果不改jet代码,肯定报错。

所以我们需要修改jet代码,找到对应的工程,我们发现jet也是一个django框架写的。
找到jet工程路径,我的是

/Users/baidu/.virtualenvs/djangodev/lib/python3.5/site-packages/jet

在dashboard子路径下,之前需要做migrate操作才有这个目录。
jet的models位置

/Users/baidu/.virtualenvs/djangodev/lib/python3.5/site-packages/jet/dashboard/models.py

找到model中的字段名:

column = models.PositiveIntegerField(verbose_name=_('column'), db_column=_('dj_column'))
order = models.IntegerField(verbose_name=_('order'), db_column=_('dj_order'))

完成,不再报错。

修改dashboard的app_label在insert的时候默认值不是空

因为在一开始启动dashboard的时候,需要insert到UserDashboardModule很多条记录,baidu的dba要求表字段必须是not null的,所以需要判断字段app_label是否是null。

~/.virtualenvs/djangodev/lib/python3.5/site-packages/jet/dashboard/dashboard.py下的
create_initial_module_models加上判断:

if self.app_label is None:
      self.app_label = ""

Django定制model字段默认值

因为baidu的DBA要求数据库表所有字段is not null和django中有的字段default null冲突,(数据库的null对应python的None),所以需要配置django的modelAdmin,让默认值不是空。
注意,不要修改django的源码,这样不便于管理增加工作负担。应该是继承modelAdmin,然后重写相应方法。

首先导入Django的类

import datetime
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

然后继承之

class CustomUserAdmin(UserAdmin):
    def __init__(self, *args, **kwargs):
        super(UserAdmin,self).__init__(*args, **kwargs)

    # Function to count objects of each user from another Model (where user is FK)
    def formfield_for_dbfield(self, db_field, **kwargs):
        field = super(UserAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        if db_field.name == 'last_login':
            now = datetime.datetime.now()
            field.initial = now.strftime('%Y-%m-%d %H:%M:%S')
        return field

    def save_model(self, request, obj, form, change):
        now = datetime.datetime.now()
        obj.last_login = now.strftime('%Y-%m-%d %H:%M:%S')
        obj.save();

最后把原来的unregister掉,register重写后的:

admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

参考(百度的人很牛啊,大方向不会错):
How to customize the auth.User Admin page in Django CRUD?

参考了这里的save_model:
Django admin的一些有用定制

admin定制中涉及表join后,需要搜索

"""Users表管理
    """
    list_display = ('user_info_id', 'acl', 'c_name', 'c_email', 'c_phone')
    #foreignKey的搜索策略
    search_fields = ('customerInfo__customer_id',)
    raw_id_fields = ('customerInfo',)

search field等于,连接的object__连接的object字段名

参考:(用的最后一个answer)
http://stackoverflow.com/questions/2106084/search-fields-in-django-python

输出model的querySet查询结果转json

from django.forms.models import model_to_dict
model_to_dict(rep)

django中已有方法
注意,rep是一个model

django 中多字段主键

class DayReportEs(models.Model):
    """ DayReportEs表model """
    ...

    class Meta(object):
        """ model配置信息 """
        managed = False
        db_table = 'day_report_es'
        unique_together = (('billing_id', 'date'),)
        # django用复合主键时,在数据库中必须有自增id

注意,unique可以联合,但是在表中必须有id自增主键,否则查询说没有id field!

django多条件查询

两个filter连用

DayReportEs.objects.using("esapis")
        .filter(date__range=(beginDate, endDate))
        .filter(billing_id=billing_id).order_by("date")

注:条件选取querySet的时候,filter表示=,exclude表示!=。
querySet.distinct() 去重复
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False

django distinct报错

NotImplementedError: DISTINCT ON fields is not supported by this database backend

是mysql的原因,被官网文档误导了,参见
http://www.yihaomen.com/article/python/526.htm

mysql的distinct应该这样写:

companys = DayReportEs.objects.using("esapis").values("billing_id", "name").distinct()

showx的表格报错

其实是在配置api链接的时候,没有最后一个斜线导致的:

http://yf-bce-36-64-56.yf01.baidu.com:8777/periodReportEs/

注意最后一个斜线,在浏览器里不写是会自动补上的,但是配置api的时候不会自动补齐

python 时间和字符串互转

pip install的app

pip install pymysql
pip install django-jet
pip install FeedParser

pip install djangorestframework
pip install markdown       
pip install django-filter  

参考链接

http://www.runoob.com/django/django-admin-manage-tool.html
https://docs.djangoproject.com/en/1.10/topics/auth/customizing/
django的restful支持
http://www.django-rest-framework.org/

版权声明:By T Yuan 举报

相关文章推荐

Django开发幼儿园管理系统---实现注册、登录功能

Django搭建问题—–用户认证问题 最近在写一个管理系统,在设计用户认证这一部分的时候遇到了不小的问题,主要是Django自带的登录认证的使用是建立在构造或者扩展User类的基础上。而在我自己...

学生信息管理后台(python+django+sql)

一、功能: 实现对学生对个人信息的增删查改 实现后台对所有学生信息的操作 二、平台: windows+pycharm(python开发工具) 三、逻辑框图四、代码展示 此后台采用的是MVC的风格模式进...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Linux安装文件到指定目录

需要在百度开发机上搭建python3环境,因为不在sudo中,所以不能装在/usr/local/lib下。 网上找到的:1) cd 到源代码解压后的目录; 2) ./configure [--pr...

Django项目实践4 - Django站点管理(后台管理员)

http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于...

python写的简答学生管理系统Demo(练习python语法)

#!/usr/local/bin/python# -*- coding:utf-8 -*- import os import re #定义学生类 class Student: def __...

Python实现学生信息管理系统(修改版)

在学习之前先要了解sqlite游标的使用方法python使用sqlite3时游标的使用方法 继上篇博客Python实现学生信息管理系统后,我就觉得写的太复杂了,然后又是一通优化、优化、优化; 本次...
  • MTbaby
  • MTbaby
  • 2017-03-07 17:15
  • 1047

蓝鲸开发平台(django框架)的搭建

最近初学django,发现框架是个好东西,特别是腾讯的蓝鲸开发平台,提供了很多现成的资源以供广大学生开发学习,但是整个框架搭建对于我这个萌新来说实在是困难,走了不少弯路,下面就把经验分享给大家,以供参...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)