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的风格模式进...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

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

Openstack Dashboard添加新界面

Horizon是OpenStack的一个子项目,用于提供一个Web前端控制台(称为Dashboard),以此来展示OpenStack的功能。通常情况下,我们都是从Horizon、Dashboard开始...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Web 开发终极工具箱: 120个 Web 开发工具

function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text...

Django完整的开发一个博客系统

今天花了一些时间搭了一个博客系统,虽然并没有相关于界面的美化,但是发布是没问题的。开发环境操作系统:windows 7 64位 Django: 1.96 Python:2.7.11 IDE: P...

Django--服务端响应url请求的执行顺序

目前使用的主要开发语言还是python,有部分会用到网站开发,顺便看了一下《web接口开发与自动化测试基于python语言》,里面有Django的一些简单介绍,必要可以基于这个来开发个简单的web界面...

如何在阿里云上部署django网站

如果仅仅想部署html或php语言的网站,那么阿里云提供了集成的服务器环境,可以不必购买ecs服务器。如果要在阿里云上部署django网站,必须使用阿里云ecs服务器。 网上有很多相关的教程,我也尝...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Django搭建管理平台
举报原因:
原因补充:

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