Django框架

Django框架全面讲解

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

本文将带大家全面了解Django框架,笔者使用的版本为1.10.

1 Django流程介绍

2 Django 基本配置

一、创建django程序

  • 终端命令:django-admin startproject sitename  (在当前目录下创建一个Django程序)
  • IDE创建Django程序时,本质上都是自动执行上述命令

其他常用命令:

  python manage.py runserver ip:port  (启动服务器,默认ip和端口为http://127.0.0.1:8000/)

  python manage.py startapp appname  (新建 app)

  python manage.py syncdb  (同步数据库命令,Django 1.7及以上版本需要用以下的命令)

  python manage.py makemigrations  (显示并记录所有数据的改动)

  python manage.py migrate  (将改动更新到数据库)

  python manage.py createsuperuser  (创建超级管理员)

  python manage.py dbshell  (数据库命令行)

  python manage.py  (查看命令列表)

二、程序目录

三、配置文件

1、数据库

支持SQLite 3(默认)、PostgreSQL 、MySQL、Oracle数据库的操作


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

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

# 默认是SQLit 3 的配置

DATABASES = {

    ‘default‘: {

        ‘ENGINE‘‘django.db.backends.sqlite3‘,

        ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),

    }

}

# MySQL的配置

DATABASES = {

    ‘default‘: {

    ‘ENGINE‘‘django.db.backends.mysql‘,

    ‘NAME‘:‘dbname‘,   #注意这里的数据库应该以utf-8编码

    ‘USER‘‘xxx‘,

    ‘PASSWORD‘‘xxx‘,

    ‘HOST‘: ‘‘,

    ‘PORT‘: ‘‘,

    }

}

# 对于python3的使用者们还需要再加一步操作

# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替

  

# 如下设置放置的与project同名的配置的 __init__.py文件中

  

import pymysql

pymysql.install_as_MySQLdb()

# PostgreSQL配置

DATABASES = {

    ‘default‘: {

        ‘NAME‘‘app_data‘,

        ‘ENGINE‘‘django.db.backends.postgresql_psycopg2‘,

        ‘USER‘‘XXX‘,

        ‘PASSWORD‘‘XXX‘

    }

# Oracle配置

DATABASES = {

    ‘default‘: {

        ‘ENGINE‘‘django.db.backends.oracle‘,

        ‘NAME‘‘xe‘,

        ‘USER‘‘a_user‘,

        ‘PASSWORD‘‘a_password‘,

        ‘HOST‘: ‘‘,

        ‘PORT‘: ‘‘,

    }

}

# 在Django中,如果需要使用不同的数据库仅需要改变以上配置即可,Django中对于不同数据库的ORM使用方法是透明(即一致)的

想要了解更多请戳这里

2、静态文件


1

2

3

4

5

6

7

8

9

10

11

12

13

# 首先在项目根目录下创建static目录

# 接着在settings.py 文件下添加

STATIC_URL = ‘/static/‘  # 默认已添加,使用静态文件时的前缀

STATICFILES_DIRS = (

        os.path.join(BASE_DIR,‘static‘), #行末的逗号不能漏

    )

# 这样在template中就可以导入static目录下的静态文件啦

# 例:

<script src="/static/jquery-1.12.4.js"></script>

  

3 Django 路由系统

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。URL的加载是从配置文件中开始。

参数说明:

  • 一个正则表达式字符串
  • 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  • 可选的要传递给视图函数的默认参数(字典形式)
  • 一个可选的name参数

一、A sample URLconf


1

2

3

4

5

6

7

8

9

10

from django.conf.urls import url

  

from import views

  

urlpatterns = [

    url(r‘^articles/2003/$‘, views.special_case_2003),

    url(r‘^articles/([0-9]{4})/$‘, views.year_archive),

    url(r‘^articles/([0-9]{4})/([0-9]{2})/$‘, views.month_archive),

    url(r‘^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$‘, views.article_detail),

]

说明:

  • 没有必要在开头加"/"符号,因为每个URL都有这个 For example, it’s ^articles, not ^/articles.
  • 在每个正则前的 ‘r‘ 是可选的,但是建议您这样做,因为这样告诉python这个字符串是未转义(raw)的,详情请见 Dive Into Python’s explanation.

请求示例:

  • 一个请求 /articles/2005/03/ 会匹配上面列表中的第三条. Django 会调用函数 views.month_archive(request, ‘2005‘, ‘03‘).
  • /articles/2005/3/ 不会匹配上面列表中的任何条目, 因为第三条的月份需要二位数字.
  • /articles/2003/ 会匹配上第一条而不是第二条,因为匹配是按照从上到下顺序而进行的, Django 会调用函数 views.special_case_2003(request)
  • /articles/2003 不会匹配上面列表中的任何条目, 因为每个URL应该以 / 结尾.
  • /articles/2003/03/03/ 会匹配上最后一条. Django 会调用函数 views.article_detail(request, ‘2003‘, ‘03‘, ‘03‘).

二、命名组(Named groups)

在上面的简单例子中,并没有使用正则表达式分组,在更高级的用法中,很有可能使用正则分组来匹配URL并且将分组值通过参数传递给view函数。

在Python的正则表达式中,分组的语法是 (?P<name>pattern), name表示分组名,pattern表示一些匹配正则.

这里是一个简单的小例子:


1

2

3

4

5

6

7

8

9

10

11

12

# 正则知识

import re

ret=re.search(‘(?P<id>\d{3})/(?P<name>\w{3})‘,‘weeew34ttt123/ooo‘)

print(ret.group())

print(ret.group(‘id‘))

print(ret.group(‘name‘))

-------------------------------------

123/ooo

123

ooo

  


1

2

3

4

5

6

7

8

9

10

from django.conf.urls import url

  

from import views

  

urlpatterns = [

    url(r‘^articles/2003/$‘, views.special_case_2003),

    url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive),

    url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$‘, views.month_archive),

    url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$‘, views.article_detail),

]

For example:

  • A request to /articles/2005/03/ 会调用函数 views.month_archive(request, year=‘2005‘,month=‘03‘), 而不是 views.month_archive(request, ‘2005‘, ‘03‘).
  • A request to /articles/2003/03/03/ 会调用函数 views.article_detail(request, year=‘2003‘,month=‘03‘, day=‘03‘).

常见写法实例:

三、二级路由(Including)

那如果映射 url 太多怎么办,全写一个在  urlpatterns 显得繁琐,so 二级路由应用而生


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

from django.conf.urls import include, url

from apps.main import views as main_views

from credit import views as credit_views

extra_patterns = [

    url(r‘^reports/$‘, credit_views.report),

    url(r‘^reports/(?P<id>[0-9]+)/$‘, credit_views.report),

    url(r‘^charge/$‘, credit_views.charge),

]

urlpatterns = [

    url(r‘^$‘, main_views.homepage),

    url(r‘^help/‘, include(‘apps.help.urls‘)),

    url(r‘^credit/‘, include(extra_patterns)),

]

在上面这个例子中,如果请求url为 /credit/reports/ 则会调用函数 credit_views.report().

使用二级路由也可以减少代码冗余,使代码更加简洁易懂

+

  

四、添加额外的参数

URLconfs 有一个钩子可以让你加入一些额外的参数到view函数中.


1

2

3

4

5

6

from django.conf.urls import url

from import views

  

urlpatterns = [

    url(r‘^blog/(?P<year>[0-9]{4})/$‘, views.year_archive, {‘foo‘‘bar‘}),

]

在上面的例子中,如果一个请求为 /blog/2005/, Django 将会调用函数l views.year_archive(request, year=‘2005‘,foo=‘bar‘).

需要注意的是,当你加上参数时,对应函数views.year_archive必须加上一个参数,参数名也必须命名为 foo,如下:


1

2

3

def year_archive(request, foo):

    print(foo)

    return render(request, ‘index.html‘)

  

五、别名的使用


1

url(r‘^index‘,views.index,name=‘bieming‘)

url中还支持name参数的配置,如果配置了name属性,在模板的文件中就可以使用name值来代替相应的url值.

我们来看一个例子:

+

  

六、指定view的默认配置


1

2

3

4

5

6

7

8

9

10

11

12

13

14

# URLconf

from django.conf.urls import url

from import views

urlpatterns = [

    url(r‘^blog/$‘, views.page),

    url(r‘^blog/page(?P<num>[0-9]+)/$‘, views.page),

]

# View (in blog/views.py)

def page(request, num="1"):

    # Output the appropriate page of blog entries, according to num.

    ...

在上述的例子中,两个 URL 模式指向同一个视图 views.page 但第一图案不捕获从 URL 任何东西。如果第一个模式匹配,该 page() 函数将使用它的默认参数 num"1"。如果第二图案相匹配时, page()将使用任何 num 值由正则表达式捕获。

3  Django Views(视图函数)

http请求中产生两个核心对象:

http请求:HttpRequest对象

http响应:HttpResponse对象

一、HttpRequest对象

当请求一个页面时,Django 创建一个 HttpRequest对象包含原数据的请求。然后 Django 加载适当的视图,通过 HttpRequest作为视图函数的第一个参数。每个视图负责返回一个HttpResponse目标。

 HttpRequest对象属性

二、HttpResponse对象

对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。

在HttpResponse对象上扩展的常用方法:

  • 页面渲染:render(推荐),render_to_response,
  • 页面跳转:redirect
  • locals:   可以直接将对应视图函数中所有的变量传给模板

值得注意的是对于页面渲染的方法中,render和render_to_response使用方法和功能类似,但是render功能更为强大,推荐使用

render()

render(requesttemplate_namecontext=Nonecontent_type=Nonestatus=Noneusing=None)[source]
结合给定的模板与一个给定的上下文,返回一个字典HttpResponse在渲染文本对象

所需的参数

template_name 一个模板的使用或模板序列名称全称。如果序列是给定的,存在于第一个模板将被使用。

可选参数

context    一组字典的值添加到模板中。默认情况下,这是一个空的字典。

content_type    MIME类型用于生成文档。

status    为响应状态代码。默认值为200

using    这个名字一个模板引擎的使用将模板。

 render示例

4  模板

一、模板的执行

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

 示例

二、 模板语言

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

  • {{ 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

 示例

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

 示例

更多见文档:https://docs.djangoproject.com/en/1.10/ref/templates/language/

5  Model

Django提供了一个抽象层(“Model”)来构建和管理Web应用程序的数据。

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

关系对象映射(Object Relational Mapping,简称ORM)。

一、创建表

1、基本结构


1

<code class="python keyword">from</code> <code class="python plain">django.db </code><code class="python keyword">import</code> <code class="python plain">models</code>

  

 class userinfo(models.Model):

    name = models.CharField(max_length=30)

    email = models.EmailField()

    memo = models.TextField()

 更多参数

 更多字段

 元信息

 拓展知识

2、连表结构

  • 一对多:models.ForeignKey(其他表)
  • 多对多:models.ManyToManyField(其他表)
  • 一对一:models.OneToOneField(其他表)

应用场景:

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

 字段以及参数

二、操作表

1、基本操作

 基本操作

2、进阶操作(了不起的双下划线)

利用双下划线将字段和对应的操作连接起来

 进阶操作

3、其他操作

 其他操作

4、连表操作(了不起的双下划线)

利用双下划线和 _set 将表之间的操作连接起来

 表结构实例

 一对一操作

 一对多

 多对多操作

扩展:

a、自定义上传

 示例

b、Form上传文件实例

 

c、ajax上传文件实例

 HTML

 Form

 Models

 View

6  中间件(MiddleWare)

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_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

分析源码得知前二个方法是从前往后执行的,后三个方法是从后往前执行的

一张图告诉你中间件的运行流程

时间: 2024-10-25 09:19:36

Django框架的相关文章

django框架&lt;二&gt;

django框架:   Models 1.基本创建 Django提供了一个抽象层("Model")的构建和管理Web应用程序的数据. Django使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). 每个模型是一个Python类,子类django.db.models.model 模型中的每个属性代表一个数据库字段. # DEMO class Student(models.Model): name = models.CharField(m

Django框架(二)

一:Django项目创建步骤: 方式1:命令创建: 进入指定目录 C:\Users\bing>F: F:\>cd mysite F:\mysite>django-admin startproject mysite F:\mysite>python manage.py startapp app01 F:\mysite>python manage.py startapp app02 F:\mysite>python manage.py startapp app03(一个Dj

Django框架(二):设计模型

1. 设计模型 我们之前操作数据库是通过写sql语句,那么能不能不写sql语句就可以操作数据库呢? 当然可以,这就要使用ORM框架了. 1.1 ORM框架 O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据.ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表

Django框架目录索引

Django框架目录索引 自定义Web框架与jinja2模板 HTTP协议详细介绍 cookie和session Django框架 (一) 环境配置及简单使用 Django框架(二) MTV模型简介 Django框架(三) url反向解析与csrf-token设置 Django框架(四) Django之模板语法 Django框架(五) Django之模板继承 Django框架 (六) Django模型 Django框架(七) Django之ORM数据库操作 Django框架(八) Django之

第三百二十一节,Django框架,发送邮件

第三百二十一节,Django框架,发送邮件 全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #发送邮件引擎 EMAIL_USE_TLS = False #是否以https方式 EMAIL_HOST = 'smtp.163.com' #邮件smtp服务器 EMAIL_PORT = 25 #端口 EMAIL_HOST_USER = '[email protected]' #发件人 EMAIL_

Django框架(二)---- 常用命令

Django框架(二) 常用命令: 文章中,命令中带有 manage.py 字样的,代表需要进入project/manage.py文件同一级的目录下 1.创建项目: django-admin startproject project-name django-admin:在Windows中,若报错,可用django-admin.py代替 project-name:项目名称,需要符合Python的包命名规范 项目结构:manage.py文件是后续命令操作的关键 2.创建App: python man

利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!

利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow  + qrcode 模块 核心代码import qrcode qr = qrcode.QRCode( version=2, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=20, border=4, ) qr.add_data('你要生成的文件') qr.make(fit=True) img = q

Django框架介绍(二)

1.MVC框架和MTV框架 MVC全名model view controller,是软件工程中的一种软件架构模式,把软件分为三个基本部分:模型(model).视图(view)和控制器(controller),具有耦合性低,重用性高.生命周期成本低等优点 django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性 django框架的不同之处自安于它拆分的三部分为:model(模型),template(模板),view视图:django使用的框架为MTV Djang

Django框架&lt;一&gt;

Django框架 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 一.django的安装实现和目录介绍 1.django实现流程 django #安装: pip3 install django 添加环境变量 #1 创建project django-admin startproject mysite ---mysite ---settings.p