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

基本配置

一、创建django程序

  • 终端命令:django-admin startproject sitename
  • IDE创建Django程序时,本质上都是自动执行上述命令

其他常用命令:

  python manage.py runserver 0.0.0.0
  python manage.py startapp appname
  python manage.py syncdb
  python manage.py makemigrations
  python manage.py migrate

  python manage.py createsuperuser

二、程序目录

三、配置文件

1、数据库

1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': {
    'ENGINE''django.db.backends.mysql',
    'NAME':'dbname',
    'USER''root',
    'PASSWORD''xxx',
    'HOST': '',
    'PORT': '',
    }
}

2、模版

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

3、静态文件

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

路由系统

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

1
2
3
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对路由规则进行一次分类

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

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

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

模板

1、模版的执行

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

  1. def current_datetime(request):
  2. now = datetime.datetime.now()
  3. html = "<html><body>It is now %s.</body></html>" % now
  4. return HttpResponse(html)
  1. from django import template
  2. t = template.Template('My name is {{ name }}.')
  3. c = template.Context({'name': 'Adrian'})
  4. print t.render(c)
  1. import datetime
  2. from django import template
  3. import DjangoDemo.settings
  4.  
  5. now = datetime.datetime.now()
  6. fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
  7. t = template.Template(fp.read())
  8. fp.close()
  9. html = t.render(template.Context({'current_date': now}))
  10. return HttpResponse(html
  1. from django.template.loader import get_template
  2. from django.template import Context
  3. from django.http import HttpResponse
  4. import datetime
  5.  
  6. def current_datetime(request):
  7. now = datetime.datetime.now()
  8. t = get_template('current_datetime.html')
  9. html = t.render(Context({'current_date': now}))
  10. return HttpResponse(html)
  1. 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

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. from django import template
  4. from django.utils.safestring import mark_safe
  5. from django.template.base import resolve_variable, Node, TemplateSyntaxError
  6.  
  7. register = template.Library()
  8.  
  9. @register.simple_tag
  10. def my_simple_time(v1,v2,v3):
  11. return v1 + v2 + v3
  12.  
  13. @register.simple_tag
  14. def my_input(id,arg):
  15. result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
  16. return mark_safe(result)

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

1
{% load xx %}

d、使用simple_tag

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

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

  1. INSTALLED_APPS = (
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'app01',
  9. )

Form

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

  • 输入html
  • 验证用户输入
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import re
  4. from django import forms
  5. from django.core.exceptions import ValidationError
  6.  
  7. def mobile_validate(value):
  8. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  9. if not mobile_re.match(value):
  10. raise ValidationError('手机号码格式错误')
  11.  
  12. class PublishForm(forms.Form):
  13.  
  14. user_type_choice = (
  15. (0, u'普通用户'),
  16. (1, u'高级用户'),
  17. )
  18.  
  19. user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
  20. attrs={'class': "form-control"}))
  21.  
  22. title = forms.CharField(max_length=20,
  23. min_length=5,
  24. error_messages={'required': u'标题不能为空',
  25. 'min_length': u'标题最少为5个字符',
  26. 'max_length': u'标题最多为20个字符'},
  27. widget=forms.TextInput(attrs={'class': "form-control",
  28. 'placeholder': u'标题5-20个字符'}))
  29.  
  30. memo = forms.CharField(required=False,
  31. max_length=256,
  32. widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3}))
  33.  
  34. phone = forms.CharField(validators=[mobile_validate, ],
  35. error_messages={'required': u'手机不能为空'},
  36. widget=forms.TextInput(attrs={'class': "form-control",
  37. 'placeholder': u'手机号码'}))
  38.  
  39. email = forms.EmailField(required=False,
  40. error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
  41. widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
  42.  
  43. def __init__(self, *args, **kwargs):
  44. super(SampleImportForm, self).__init__(*args, **kwargs)
  45.  
  46. self.fields['idc'].widget.choices = models.IDC.objects.all().order_by('id').values_list('id','display')
  47. self.fields['business_unit'].widget.choices = models.BusinessUnit.objects.all().order_by('id').values_list('id','name')
  48.  
  49. Forms
  1. def publish(request):
  2. ret = {'status': False, 'data': '', 'error': '', 'summary': ''}
  3. if request.method == 'POST':
  4. request_form = PublishForm(request.POST)
  5. if request_form.is_valid():
  6. request_dict = request_form.clean()
  7. print request_dict
  8. ret['status'] = True
  9. else:
  10. error_msg = request_form.errors.as_json()
  11. ret['error'] = json.loads(error_msg)
  12. return HttpResponse(json.dumps(ret))
  13.  
  14. Views

扩展:ModelForm

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

  1. class AdminModelForm(forms.ModelForm):
  2.  
  3. class Meta:
  4. model = models.Admin
  5. #fields = '__all__'
  6. fields = ('username', 'email')
  7.  
  8. widgets = {
  9. 'email' : forms.PasswordInput(attrs={'class':"alex"}),
  10. }

Model

到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

  • 创建数据库,设计表结构和字段
  • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作
  1. import MySQLdb
  2.  
  3. def GetList(sql):
  4. db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')
  5. cursor = db.cursor()
  6. cursor.execute(sql)
  7. data = cursor.fetchall()
  8. db.close()
  9. return data
  10.  
  11. def GetSingle(sql):
  12. db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')
  13. cursor = db.cursor()
  14. cursor.execute(sql)
  15. data = cursor.fetchone()
  16. db.close()
  17. return data

django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)。

  PHP:activerecord

  Java:Hibernate

  C#:Entity Framework

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

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

  1. from django.db import models
  2.  
  3. class userinfo(models.Model):
  4. name = models.CharField(max_length=30)
  5. email = models.EmailField()
  6. memo = models.TextField()
  1. 1models.AutoField  自增列 = int(11)
  2.   如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True
  3. 2models.CharField  字符串字段
  4.   必须 max_length 参数
  5. 3models.BooleanField  布尔类型=tinyint(1)
  6.   不能为空,Blank=True
  7. 4models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  8.   继承CharField,所以必须 max_lenght 参数
  9. 5models.DateField  日期类型 date
  10.   对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
  11. 6models.DateTimeField  日期类型 datetime
  12.   DateField的参数
  13. 7models.Decimal  十进制小数类型 = decimal
  14.   必须指定整数位max_digits和小数位decimal_places
  15. 8models.EmailField  字符串类型(正则表达式邮箱) =varchar
  16.   对字符串进行正则表达式
  17. 9models.FloatField  浮点类型 = double
  18. 10models.IntegerField  整形
  19. 11models.BigIntegerField  长整形
  20.   integer_field_ranges = {
  21.     'SmallIntegerField': (-32768, 32767),
  22.     'IntegerField': (-2147483648, 2147483647),
  23.     'BigIntegerField': (-9223372036854775808, 9223372036854775807),
  24.     'PositiveSmallIntegerField': (0, 32767),
  25.     'PositiveIntegerField': (0, 2147483647),
  26.   }
  27. 12models.IPAddressField  字符串类型(ip4正则表达式)
  28. 13models.GenericIPAddressField  字符串类型(ip4ip6是可选的)
  29.   参数protocol可以是:bothipv4ipv6
  30.   验证时,会根据设置报错
  31. 14models.NullBooleanField  允许为空的布尔类型
  32. 15models.PositiveIntegerFiel  正Integer
  33. 16models.PositiveSmallIntegerField  正smallInteger
  34. 17models.SlugField  减号、下划线、字母、数字
  35. 18models.SmallIntegerField  数字
  36.   数据库中的字段有:tinyintsmallintintbigint
  37. 19models.TextField  字符串=longtext
  38. 20models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
  39. 21models.URLField  字符串,地址正则表达式
  40. 22models.BinaryField  二进制
  41. 23models.ImageField 图片
  42. 24models.FilePathField 文件
  43.  
  44. 更多字段
  1. 1null=True
  2.   数据库中字段是否可以为空
  3. 2blank=True
  4.   django Admin 中添加数据时是否可允许空值
  5. 3primary_key = False
  6.   主键,对AutoField设置主键后,就会代替原来的自增 id
  7. 4auto_now auto_now_add
  8.   auto_now 自动创建---无论添加或修改,都是当前操作的时间
  9.   auto_now_add 自动创建---永远是创建时的时间
  10. 5choices
  11. GENDER_CHOICE = (
  12. (u'M', u'Male'),
  13. (u'F', u'Female'),
  14. )
  15. gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
  16. 6max_length
  17. 7default  默认值
  18. 8verbose_name  Admin中字段的显示名称
  19. 9name|db_column  数据库中的字段名称
  20. 10unique=True  不允许重复
  21. 11db_index = True  数据库索引
  22. 12editable=True  在Admin里是否可编辑
  23. 13error_messages=None  错误提示
  24. 14auto_created=False  自动创建
  25. 15help_text  在Admin中提示帮助信息
  26. 16validators=[]
  27. 17upload-to
  28.  
  29. 更多参数

2、连表关系:

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

应用场景:

  • 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)。
    例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据。
  • 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)。
    例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
  • 多对多:在某表中创建一行数据是,有一个可以多选的下拉框。
    例如:创建用户信息,需要为用户指定多个爱好。

3、数据库操作

    1. 增加:创建实例,并调用save
    2. 更新:a.获取实例,再sava;b.update(指定列)
    3. 删除:a. filter().delete(); b.all().delete()
    4. 获取:a. 单个=get(id=1) ;b. 所有 = all()
    5. 过滤:filter(name='xxx');filter(name__contains='');(id__in = [1,2,3]) ;
      icontains(大小写无关的LIKE),startswith和endswith, 还有range(SQLBETWEEN查询)'gt', 'in', 'isnull', 'endswith', 'contains', 'lt', 'startswith', 'iendswith', 'icontains','range', 'istartswith'
    6. 排序:order_by("name") =asc ;order_by("-name")=desc
    7. 返回第n-m条:第n条[0];前两条[0:2]
    8. 指定映射:values
    9. 数量:count()
    10. 聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))
    11. 原始SQL
    1. cursor = connection.cursor()
    2. cursor.execute('''SELECT DISTINCT first_name ROM people_person WHERE last_name = %s""", ['Lennon'])
    3. row = cursor.fetchone()

     

上传文件实例:

  1. class FileForm(forms.Form):
  2. ExcelFile = forms.FileField()
  1. from django.db import models
  2.  
  3. class UploadFile(models.Model):
  4. userid = models.CharField(max_length = 30)
  5. file = models.FileField(upload_to = './upload/')
  6. date = models.DateTimeField(auto_now_add=True)
  1. def UploadFile(request):
  2. uf = AssetForm.FileForm(request.POST,request.FILES)
  3. if uf.is_valid():
  4. upload = models.UploadFile()
  5. upload.userid = 1
  6. upload.file = uf.cleaned_data['ExcelFile']
  7. upload.save()
  8.  
  9. print upload.file
  10.  
  11. View

中间件

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

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

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

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

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

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

自定义中间件

1、创建中间件类

  1. class RequestExeute(object):
  2.  
  3. def process_request(self,request):
  4. pass
  5. def process_view(self, request, callback, callback_args, callback_kwargs):
  6. i =1
  7. pass
  8. def process_exception(self, request, exception):
  9. pass
  10.  
  11. def process_response(self, request, response):
  12. return response

2、注册中间件

  1. MIDDLEWARE_CLASSES = (
  2. 'django.contrib.sessions.middleware.SessionMiddleware',
  3. 'django.middleware.common.CommonMiddleware',
  4. 'django.middleware.csrf.CsrfViewMiddleware',
  5. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  6. 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. 'wupeiqi.middleware.auth.RequestExeute',
  10. )

admin

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

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

1、创建后台管理员

1
python manage.py createsuperuser

2、配置后台管理url

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

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

a、在admin中执行如下配置

  1. from django.contrib import admin
  2.  
  3. from app01 import models
  4.  
  5. admin.site.register(models.UserType)
  6. admin.site.register(models.UserInfo)
  7. admin.site.register(models.UserGroup)
  8. admin.site.register(models.Asset)

b、设置数据表名称

  1. class UserType(models.Model):
  2. name = models.CharField(max_length=50)
  3.  
  4. class Meta:
  5. verbose_name = '用户类型'
  6. verbose_name_plural = '用户类型'

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

  1. class UserType(models.Model):
  2. name = models.CharField(max_length=50)
  3.  
  4. def __unicode__(self):
  5. return self.name
  1. from django.contrib import admin
  2.  
  3. from app01 import models
  4.  
  5. class UserInfoAdmin(admin.ModelAdmin):
  6. list_display = ('username', 'password', 'email')
  7.  
  8. admin.site.register(models.UserType)
  9. admin.site.register(models.UserInfo,UserInfoAdmin)
  10. admin.site.register(models.UserGroup)
  11. admin.site.register(models.Asset)

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

  1. from django.contrib import admin
  2.  
  3. from app01 import models
  4.  
  5. class UserInfoAdmin(admin.ModelAdmin):
  6. list_display = ('username', 'password', 'email')
  7. search_fields = ('username', 'email')
  8.  
  9. admin.site.register(models.UserType)
  10. admin.site.register(models.UserInfo,UserInfoAdmin)
  11. admin.site.register(models.UserGroup)
  12. admin.site.register(models.Asset)

e、添加快速过滤

  1. from django.contrib import admin
  2.  
  3. from app01 import models
  4.  
  5. class UserInfoAdmin(admin.ModelAdmin):
  6. list_display = ('username', 'password', 'email')
  7. search_fields = ('username', 'email')
  8. list_filter = ('username', 'email')
  9.  
  10. admin.site.register(models.UserType)
  11. admin.site.register(models.UserInfo,UserInfoAdmin)
  12. admin.site.register(models.UserGroup)
  13. admin.site.register(models.Asset)

Python:Django【基础篇】的更多相关文章

  1. 01: Django基础篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  2. python的django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

  3. 01:django基础篇

    Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ...

  4. python3之Django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

  5. [python][django学习篇][5]选择数据库版本(默认SQLite3) 与操作数据库

    推荐学习博客:http://zmrenwu.com/post/6/ 选择数据库版本(SQLite3) 如果想选择MySQL等版本数据库,请先安装MySQL并且安装python mysql驱动,这里不做 ...

  6. python Django基础操作

    Django常用命令 创建Django项目 Django-admin startprotect  mysite 创建项目以后,以下生成的文件 最外层的file:mysite/ 根目录只是你的项目的容器 ...

  7. python+selenium基础篇,切入切出frame

    1.首先制作一个html的文件,代码如下 <!DOCTYPE html> <html> <head> <title>Frame_test</tit ...

  8. python 之 Django 基础篇

    1,Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据 ...

  9. Python学习-day19 django基础篇

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

  10. python django基础(二)

    django MTV模式之----template模版 django是动态的网页,后台的数据需要动态的插入到前端中,这时就依赖于django的template模版框架.django支持多种模版框架,下 ...

随机推荐

  1. OOP几大原则【转】

    设计模式遵循的一般原则: 1.开-闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开发,对修改关闭.说的是,再设计一个模块的时候,应当使这个模块可以在不被修改的前 ...

  2. Macro definition of snprintf conflicts with Standard Library function declaration

    Macro definition of snprintf conflicts with Standard Library function declaration 即将此处的宏定义注释掉,因为在VS2 ...

  3. grid 布局一 固定宽度+自适应宽度

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. iOS学习笔记23-音效与音乐

    一.音频 在iOS中,音频播放从形式上能够分为音效播放和音乐播放. * 音效: * 主要指一些短音频的播放,这类音频一般不须要进行进度.循环等控制. * 在iOS中.音效我们是使用AudioToolb ...

  5. 取给定正整数的指定bit位開始的指定长度的数据

    接口说明 原型: unsigned int GetBitsValue(unsigned int input, unsigned int startbit, unsigned int bitlen) 输 ...

  6. css学习之overlay

    CSS Overlay技巧 作者:大漠 日期:2013-11-10 点击:8  本文由大漠根据SARA SOUEIDAN的<CSS OVERLAY TECHNIQUES>所译,整个译文带 ...

  7. 腾讯云 net.core

    搭建 .NET Core 开发环境 安装 .Net Core 执行代码 任务时间:时间未知 .NET Core 的官方文档很详细,本实验带你建立一个.NET Core 1.1的Web运行环境,更多内容 ...

  8. 从DTS到驱动加载的过程分析

    http://blog.csdn.net/iefswang/article/details/40543733 http://www.linuxidc.com/Linux/2013-07/86839.h ...

  9. 辛星浅析Linux中的postfix

    Postfix是眼下Linux下主流的邮件server,也就是MTA,主要用来实现SMTP协议,它能够兼容sendmail.而postfix也是为了改进sendmail而制作产生的. 通常来说.pos ...

  10. AF_UNIX和AF_INET域的socket在epoll中的差异

    1.AF_UNIX & SOCK_STREAM 1.1 accept_socket BLOCK EPOLLIN|EPOLLET 1.2 accept_socket NON-BLOCK EPOL ...