Django基础(一)

文章出处http://www.cnblogs.com/wupeiqi/articles/4491246.html

前戏

python Web程序

众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

复制代码
#!/usr/bin/env python
#coding:utf-8
 
import socket
 
def handle_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n")
    client.send("Hello, Seven")
 
def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8000))
    sock.listen(5)
 
    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()
 
if __name__ == '__main__':
    main()
复制代码

上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。

python标准库提供的独立WSGI服务器称为wsgiref。

复制代码
#!/usr/bin/env python
#coding:utf-8

from wsgiref.simple_server import make_server

def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'

if __name__ == '__main__':
    httpd = make_server('', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()
复制代码

自定义Web框架

通过python标准库提供的wsgiref模块开发一个自己的Web框架

复制代码
#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server

def index():
    return 'index'

def login():
    return 'login'

def routers():
    
    urlpatterns = (
        ('/index/',index),
        ('/login/',login),
    )
    
    return urlpatterns

def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    url = environ['PATH_INFO']
    urlpatterns = routers()
    func = None
    for item in urlpatterns:
        if item[0] == url:
            func = item[1]
            break 
    if func:
        return func()
    else:
        return '404 not found'
    
if __name__ == '__main__':
    httpd = make_server('', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()
复制代码

MVC和MTV

  MVC:Model、View、Controller

  MTV:Model、Template、View

Django

一、创建django程序

  1、终端:django-admin startproject sitename

  2、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

二、Django程序目录

  

三、配置文件

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: 点击下载

五、模型

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

  • 创建数据库,设计表结构和字段
  • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作
复制代码
import MySQLdb
 
def GetList(sql):
    db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')
    cursor = db.cursor()
    cursor.execute(sql)
    data = cursor.fetchall()
    db.close()
    return data
 
def GetSingle(sql):
    db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')
    cursor = db.cursor()
    cursor.execute(sql)
    data = cursor.fetchone()
    db.close()
    return data
复制代码

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

  PHP:activerecord

  Java:Hibernate 

    C#:Entity Framework

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

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

1
2
3
4
5
6
from django.db import models
 
class userinfo(models.Model):
     name = models.CharField(max_length = 30 )
     email = models.EmailField()
     memo = models.TextField()

更多字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1 、models.AutoField  自增列 = int ( 11 )
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key = True
2 、models.CharField  字符串字段
  必须 max_length 参数
3 、models.BooleanField  布尔类型 = tinyint( 1 )
  不能为空,Blank = True
4 、models.ComaSeparatedIntegerField  用逗号分割的数字 = varchar
  继承CharField,所以必须 max_lenght 参数
5 、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6 、models.DateTimeField  日期类型 datetime
  同DateField的参数
7 、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8 、models.EmailField  字符串类型(正则表达式邮箱) = varchar
  对字符串进行正则表达式
9 、models.FloatField  浮点类型 = double
10 、models.IntegerField  整形
11 、models.BigIntegerField  长整形
  integer_field_ranges = {
     'SmallIntegerField' : ( - 32768 , 32767 ),
     'IntegerField' : ( - 2147483648 , 2147483647 ),
     'BigIntegerField' : ( - 9223372036854775808 , 9223372036854775807 ),
     'PositiveSmallIntegerField' : ( 0 , 32767 ),
     'PositiveIntegerField' : ( 0 , 2147483647 ),
  }
12 、models.IPAddressField  字符串类型(ip4正则表达式)
13 、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14 、models.NullBooleanField  允许为空的布尔类型
15 、models.PositiveIntegerFiel  正Integer
16 、models.PositiveSmallIntegerField  正smallInteger
17 、models.SlugField  减号、下划线、字母、数字
18 、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、 int 、bigint
19 、models.TextField  字符串 = longtext
20 、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21 、models.URLField  字符串,地址正则表达式
22 、models.BinaryField  二进制<br> 23 、models.ImageField   图片<br> 24 、models.FilePathField 文件

更多字段的参数:

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

数据库中表与表之间的关系:

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

应用场景:

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

2、数据库操作

  • 增加:创建实例,并调用save
  • 更新:a.获取实例,再sava;b.update(指定列)
  • 删除:a. filter().delete(); b.all().delete()
  • 获取:a. 单个=get(id=1) ;b. 所有 = all()
  • 过滤: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'
  • 排序:order_by("name") =asc ;order_by("-name")=desc
  • 返回第n-m条:第n条[0];前两条[0:2]
  • 指定映射:values
  • 数量:count()
  • 聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))
  • 原始SQL
    1
    2
    3
    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()
复制代码
from django.db import models

class UploadFile(models.Model):
    userid = models.CharField(max_length = 30)
    file = models.FileField(upload_to = './upload/')
    date = models.DateTimeField(auto_now_add=True)
复制代码
复制代码
def UploadFile(request):
    uf = AssetForm.FileForm(request.POST,request.FILES)
    if uf.is_valid():
            upload = models.UploadFile()
            upload.userid = 1
            upload.file = uf.cleaned_data['ExcelFile']
            upload.save()
            
            print upload.file
复制代码

六、模版

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))

注意:当数据POST的时候,Django做了跨站请求伪造

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 }}

通过simple_tag实现模版语言中的帮助方法

a、在app中创建templatetags文件夹

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python
#coding:utf-8
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 文件名

1
{ % load xxx % }

d、使用simple_tag

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

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

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = (
     'django.contrib.admin' ,
     'django.contrib.auth' ,
     'django.contrib.contenttypes' ,
     'django.contrib.sessions' ,
     'django.contrib.messages' ,
     'django.contrib.staticfiles' ,
     'app01' ,
)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Django基础教程PDF是一本详细讲解Django框架的书籍。Django是一个基于Python的高效Web应用开发框架,使用Django可以快速开发高质量、安全且易维护的Web应用程序。这本书从Django基础概念、安装、配置、模型、视图、模板、表单、认证、管理等方面,详细解释了如何使用Django进行Web应用开发。 其中,书籍的第一部分主要讲解了Django框架的基础知识,包括Django的架构、安装配置、虚拟环境、应用以及包管理等等。第二部分则详细阐述了Django的各种模型,包括Model、QuerySet以及Django ORM的操作等。第三部分则重点讲解了Django的视图,包括视图函数、URL路由以及视图的响应等等。第四部分则阐述了Django的模板系统,包括模板语言、模板渲染以及静态文件等。第五部分讲解了Django的表单系统,包括表单类的定义、视图函数的编写以及表单的提交和验证等。第六部分则深入讲解Django的认证系统、权限管理以及用户注册等内容。最后一部分则介绍了Django的管理后台、中间件、缓存、测试和部署等方面的内容。 总之,Django基础教程PDF对于想要学习并掌握Django框架的开发者来说是一本非常好的入门书籍。它详细介绍了Django框架的整个开发流程,给予开发者夯实的理论基础和实操能力,让开发者能够高效地使用Django框架进行Web应用开发。 ### 回答2: Django是一个高效的Python Web应用程序框架,它的特点是快速开发、可拓展性和丰富的功能性。对于初学者来说,学习Django框架并不是一件容易的事情,因此《Django基础教程》成为了很多开发者必备的学习资料。 《Django基础教程》详细介绍了Django框架的各种概念和操作方法,包括了模型、视图、模板、表单、路由等方面的基础知识。这本教程以实践为主,让读者通过自己手写一个简单的博客系统来获取对Django框架的全面认识。 教程的阅读需要基本的Python编程知识,因为它是使用Python语言编写的。在读完本教程后,读者可以掌握Django框架的开发流程,了解Django的中间件和模型、视图、模板的关系,掌握如何与数据库进行交互以及如何使用Django表单等。 值得一提的是,《Django基础教程》是一本中文教程,将一些比较抽象的概念解释得十分清楚易懂。而且它还针对Django 2.x 版本进行了详细介绍,非常贴近当前开发环境,可以让读者快速开发出一个简单的Web应用程序。 总而言之,《Django基础教程》是一本非常优秀、权威、全面的Django框架学习资料,它的内容详尽,范例丰富,让读者学习起来既轻松而又有深度。对于初学者来说,它是一个不容错过的学习宝典。 ### 回答3: Django是一个流行的Python Web框架,已经成为许多Web应用程序开发人员的首选。有很多教程和资源可用,其中包括Django基础教程,可作为入门学习Django的教材。 这本教程的重点是了解Django基础知识,例如Django框架的架构、模型-视图-控制器(MVC)模式、Django模型和Django视图等。它涵盖了创建新的Django项目,如何在Django项目中创建和管理应用程序,以及如何利用Django模板和表单在网页中呈现和处理数据。 该教程还提供了一些简单的应用程序示例,如博客和投票应用程序,这些教程旨在帮助读者嵌入并了解Django的工作原理。 在学习Django基础教程时,读者将学习如何编写干净、可读、可扩展和可维护的代码。这是应用程序开发中的最佳实践之一,有助于确保应用程序的可靠性。 总之,Django基础教程是入门学习Django框架的好材料,它能够为初学者提供一些基本的理解和编程技能,同时也提供了一些实用而有趣的示例,帮助学习者了解和熟悉Django框架的工作方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值