Python的web矿建有Django、Tornado、Flask等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定,模版引擎、缓存、Session等诸多功能。

基本配置

一、创建django程序

终端命令:django-admin startproject sitename

IDE创建Django程序时,本质都是自动执行上述命令

其他常用命令:

python manage.py runserver 0.0.0.0  #运行Django,默认是127.0.0.1,如果在不同服务器上访问后面直接加本机IP

python manage.py startapp appname  #创建app,后面直接跟创建的app名称

python manage.py syncdb  #安装数据库

python manage.py makemigrations  #

python manage.py migrate

python manage.py createsuperuser

二、程序目录

三、配置文件

安装数据库

E:\python\\html\mysite>python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'administrator'): root #数据库名称
Email address:
Password: #数据库密码
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed object(s) from fixture(s)

1、数据库

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'USER': 'root',
'PASSWORD': '123456',
'HOST': '',
'PORT': '',
}
}

2、模版

TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates'),
)

3、静态文件

STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)

路由系统

1、每个路由规则对应一个view中的函数

url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

2、根据app对路由规则进行一次分类

url(r'^web/',include('web.urls')),

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的web框架则是对一类的url请求做一条路由映射,从而使路由变得简介。

通过反射机制,为django开发一套动态的路由系统Demo:点击下载 

模版

1、模版的执行

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将Model中获取的数据插入到模版中,最后将信息返回给用户。

def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)
import datetime
from django import template
import DjangoDemo.settings now = datetime.datetime.now()
fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime def current_datetime(request):
now = datetime.datetime.now()
t = get_template('current_datetime.html')
html = t.render(Context({'current_date': now}))
return HttpResponse(html)
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))

2、模版语言

模版中也有自己的语言,该语言可以实现数据展示

  • {{ item }}
  • {% for item in item_list %} <a>{{ item }}</a> {% endfor %}

    forloop.counter

    forloop.first

    forloop.last

  • {% if ordered_warranty %} {% else %} {% endif %}
  • 母板:{% block title %}{% endblock %}

   子板:{% extends "base.html"%}

      {% block title %}{% endblock %}

  • 帮助方法:

  {{ item.event_start|date:"Y-m-d H:i:s"}}

  {{ bio|truncatewords:"30" }}

  {{ my_list|first|upper }}

  {{ name|lower }}  

3、自定义simple_tag

a、在app中创建templatetags模块

b、创建任意.py文件,如:xx.py

#!/usr/bin/env python
#coding:utf-
from django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable, Node, TemplateSyntaxError register = template.Library() @register.simple_tag
def my_simple_time(v1,v2,v3):
return v1 + v2 + v3 @register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result)

c、在使用自定义simple_tag的html文件中导入之前创建的xx.py文件名

{% load xx %}

d、使用simple_tag

{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}

e、在settings中配置当前app,不然django无法找到自定义的simple_tag

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
)

Form

django中的Form一般有两种功能:

  • 输入html
  • 验证用户输入
#!/usr/bin/env python
# -*- coding:utf- -*-
import re
from django import forms
from django.core.exceptions import ValidationError def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手机号码格式错误') class PublishForm(forms.Form): user_type_choice = (
(, u'普通用户'),
(, u'高级用户'),
) user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
attrs={'class': "form-control"})) title = forms.CharField(max_length=,
min_length=,
error_messages={'required': u'标题不能为空',
'min_length': u'标题最少为5个字符',
'max_length': u'标题最多为20个字符'},
widget=forms.TextInput(attrs={'class': "form-control",
'placeholder': u'标题5-20个字符'})) memo = forms.CharField(required=False,
max_length=,
widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': })) phone = forms.CharField(validators=[mobile_validate, ],
error_messages={'required': u'手机不能为空'},
widget=forms.TextInput(attrs={'class': "form-control",
'placeholder': u'手机号码'})) email = forms.EmailField(required=False,
error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

Form

def publish(request):
ret = {'status': False, 'data': '', 'error': '', 'summary': ''}
if request.method == 'POST':
request_form = PublishForm(request.POST)
if request_form.is_valid():
request_dict = request_form.clean()
print request_dict
ret['status'] = True
else:
error_msg = request_form.errors.as_json()
ret['error'] = json.loads(error_msg)
return HttpResponse(json.dumps(ret))

Views

扩展:ModelForm

在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去Form中字段的定义

class AdminModelForm(forms.ModelForm):

    class Meta:
model = models.Admin
#fields = '__all__'
fields = ('username', 'email') widgets = {
'email' : forms.PasswordInput(attrs={'class':"wulaoer"}),
}

Model

到目前位置,当我们的程序设计到数据库相关操作时,我们一般都会这么搞:

  • 创建数据库,设计表结构和字段
  • 使用MySQLdb来连接数据库,并编写数据库访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作
import MySQLdb

def GetList(sql):
db = MySQLdb.connect(user='root', db='wulaoer', passwd='', host='localhost')
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchall()
db.close()
return data def GetSingle(sql):
db = MySQLdb.connect(user='root', db='wulaoer', passwd='', host='localhost')
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchone()
db.close()
return data

django中遵循Code Frist的原则,即:根据代码中定义的类来自动生成数据库表。

1、创建Mdoel,之后可以根据Model来创建数据库表

from django.db import models

class userinfo(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField()
memo = models.TextField()
、models.AutoField  自增列 = int()
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
、models.CharField  字符串字段
  必须 max_length 参数
、models.BooleanField  布尔类型=tinyint()
  不能为空,Blank=True
、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
、models.DateTimeField  日期类型 datetime
  同DateField的参数
、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
、models.FloatField  浮点类型 = double
、models.IntegerField  整形
、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-, ),
    'IntegerField': (-, ),
    'BigIntegerField': (-, ),
    'PositiveSmallIntegerField': (, ),
    'PositiveIntegerField': (, ),
  }
、models.IPAddressField  字符串类型(ip4正则表达式)
、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
、models.NullBooleanField  允许为空的布尔类型
、models.PositiveIntegerFiel  正Integer
、models.PositiveSmallIntegerField  正smallInteger
、models.SlugField  减号、下划线、字母、数字
、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
、models.TextField  字符串=longtext
、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
、models.URLField  字符串,地址正则表达式
、models.BinaryField  二进制
、models.ImageField 图片
、models.FilePathField 文件

更多字段

、null=True
  数据库中字段是否可以为空
、blank=True
  django的 Admin 中添加数据时是否可允许空值
、primary_key = False
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
、auto_now 和 auto_now_add
  auto_now 自动创建---无论添加或修改,都是当前操作的时间
  auto_now_add 自动创建---永远是创建时的时间
、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=,choices = GENDER_CHOICE)
、max_length
、default  默认值
、verbose_name  Admin中字段的显示名称
、name|db_column  数据库中的字段名称
、unique=True  不允许重复
、db_index = True  数据库索引
、editable=True  在Admin里是否可编辑
、error_messages=None  错误提示
、auto_created=False  自动创建
、help_text  在Admin中提示帮助信息
、validators=[]
、upload-to

更多参数

2、连表关系:

  • 一对多,models.ForeignKey(ColorDic)
  • 一对一,models.OneToOneField(OneModel)
  • 多对多,authors = models.ManyToManyField(Author)

应用场景:

  • 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)。

  例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表在添加3列数据。

  •  一对多,当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)。

  例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。

  • 多对多:在某表中创建一行数据是,有一个可以多选的下拉框。

  例如:创建用户信息,需要为用户指定多个爱好。

3、数据库操作

  • 增加:创建实例,并调用sava
  • 更新:a.获取实例,在sava;b.update(指定列)
  • 删除:a.filter().delete();b.all().delete()
  • 获取:a.单个=get(id=1);b,所有 = all()
  • 过滤:filter(name='xxx');fileter(name__contains='');(id__in = [1,2,3]);

  icontains(大小写无关的LIKE),startswith和endswith,还有range(SQLBETWEEN查询) ‘gt’, 'in', 'isnull', 'endswith', 'contains', 'it', 'startswith', 'lendswith', 'icontains', 'range', 'istartswith'

  • 排序:order_by("name") =asc; order_by("-name")=desc
  • 返回第n-m条:第n条[0];前两条[0:2]
  • 指定映射:calues
  • 数量:count()
  • 聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))
  • 原始SQL
cursor = connection.cursor()
cursor.execute('''SELECT DISTINCT first_name ROM people_person WHERE last_name = %s""", ['Lennon'])
row = cursor.fetchone()

上传文件实例:

class FileForm(forms.Form):
ExcelFile = forms.FileField()

Form

from django.db import models

class UploadFile(models.Model):
userid = models.CharField(max_length = )
file = models.FileField(upload_to = './upload/')
date = models.DateTimeField(auto_now_add=True)

Model

def UploadFile(request):
uf = AssetForm.FileForm(request.POST,request.FILES)
if uf.is_valid():
upload = models.UploadFile()
upload.userid =
upload.file = uf.cleaned_data['ExcelFile']
upload.save() print upload.file

View

中间件

django中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件,如下。

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'wulaoer.middleware.auth.Authentication'
)

与mange.py在同一目录下的文件夹wulaoer/middleware下的auth.py文件中的Authentication类

中间件中可以定义四个方法,分别是:

  • process_request(self,request) 
  • process_view(self,request,exception)
  • process_exception(self,request,exception)
  • process_response(self,request,response)

以上方法的返回值跨越式None和HttpReson对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。

自定义中间件

1、创建中间件类

class RequestExeute(object):

    def process_request(self,request):
pass
def process_view(self, request, callback, callback_args, callback_kwargs):
i =1
pass
def process_exception(self, request, exception):
pass def process_response(self, request, response):
return response

2、注册中间件

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'wulaoer.middleware.auth.RequestExeute',
)

admin

django admin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,而使用django admin则需要以下步骤:

  • 创建后台管理员
  • 配置url
  • 注册和配置django admin后台管理页面

1、创建后台管理员

python manage.py createsuperuser

2、配置后台管理url

url(r'^admin/', include(admin.site.urls))

3、注册和配置django admin后台管理页面

a、在admin中执行如下配置

from django.contrib import admin

from app01 import  models

admin.site.register(models.UserType)
admin.site.register(models.UserInfo)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)

b、设置数据表名称

class UserType(models.Model):
name = models.CharField(max_length=50) class Meta:
verbose_name = '用户类型'
verbose_name_plural = '用户类型'

c、打开表之后,设定默认显示,需要在model中作如下配置

class UserType(models.Model):
name = models.CharField(max_length=50) def __unicode__(self):
return self.name
from django.contrib import admin

from app01 import  models

class UserInfoAdmin(admin.ModelAdmin):
list_display = ('username', 'password', 'email') admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)

d、为数据表添加搜索功能

from django.contrib import admin

from app01 import  models

class UserInfoAdmin(admin.ModelAdmin):
list_display = ('username', 'password', 'email')
search_fields = ('username', 'email') admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)

e、添加快速过滤

from django.contrib import admin

from app01 import  models

class UserInfoAdmin(admin.ModelAdmin):
list_display = ('username', 'password', 'email')
search_fields = ('username', 'email')
list_filter = ('username', 'email') admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)

更多:http://docs.30c.org/djangobook2/chapter06/

Django: 之数据库完美解析的更多相关文章

  1. Django: 之数据库导入、迁移和联用

    Django 数据库导入 从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1 ...

  2. 让Django支持数据库长连接(可以提高不少性能哦)

    书接上回 上回我们说到:<在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用> 那么现在很流行用一些高性能的nonblock的app server ...

  3. 第二章、Django以及数据库的配置

    目录 第二章.Django以及数据库的配置 一.小白必会三板斧 二.静态文件配置 三.form表单 action和method参数可以写的形式 四.request对象及方法 五.django连接数据库 ...

  4. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  5. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  6. Django模型-数据库操作

    前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...

  7. Django查询数据库性能优化

    现在有一张记录用户信息的UserInfo数据表,表中记录了10个用户的姓名,呢称,年龄,工作等信息. models文件 from django.db import models class Job(m ...

  8. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  9. Linux下安装Python3的django并配置mysql作为django默认数据库(转载)

    我的操作系统为centos6.5 1  首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包 ...

随机推荐

  1. Ajax.BeginForm 异步上传附件 替代方案

      一:问题描述 含有文件信息表单内容,想通过异步上传到服务器,但是使用Ajax.BeginForm上传时,后台无法获取文件信息 二:解决方案 通过  $.ajaxFileUpload 可以实现文件及 ...

  2. HIVE 简单总结

    hive 1 table 查看 表show tables;查看表结构desc table_name; 2 database 默认 default 创建databasecreate database_n ...

  3. 3. Shell 基本运算符

    1. 概述 1.1 Shell 支持多种运算符,包括以下几种 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 1.2 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例 ...

  4. 恢复SQLSERVER被误删除的数据(转)

    恢复SQLSERVER被误删除的数据 曾经想实现Log Explorer for SQL Server的功能,利用ldf里面的日志来还原误删除的数据 这里有一篇文章做到了,不过似乎不是所有的数据类型都 ...

  5. iOS可变字符串的所有操作

    可直接把代码复制即可结合输出看结果加深记忆 //创建一个可变字符串 NSMutableString * ms1 = [[NSMutableString alloc]init]; //可以通过类方法来创 ...

  6. delete、truncate与drop的区别

    转自:SQL truncate .delete与drop区别 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DD ...

  7. mvc 母版页、用户自定义控件

    母版页(Master) 1.母版页是与Controller无关的,母版页只是一个View文件,而没有任何Controller与之相对应. 2.其实在ASP.NET MVC中View的aspx与母版页并 ...

  8. diff and patch

    A patch captures the changes of two different files (oldfile and newfile). Given the oldfile and the ...

  9. swf version 与flash player 对应关系

    2013-04-16更新:更新Flash Player 11.7/AIR 3.7正式版. 详细链接FlashPlayer 11.7详情 2013-03-10更新:更新Flash Player 11.6 ...

  10. CentOS7 PostgreSQL 主从配置( 二)

    同步流复制配置PostgreSql的流复制是异步的,缺点是Standby上的数据落后于主库上的数据,如果使用Hot Standby做读写分离,就会存在数据一致性的问题.PostgreSql9.1版本后 ...