【python】Web应用框架Django

环境:win10
python:3.7.1
Django:2.1.3(pip install Django==2.1.3)

Django简介

Django是一个开放源代码的Web应用框架,由Python写成。
Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。
Django 版本对应的 Python 版本:

Django 版本 Python 版本
1.8 2.7, 3.2 , 3.3, 3.4, 3.5
1.9, 1.10 2.7, 3.4, 3.5
1.11 2.7, 3.4, 3.5, 3.6
2.0 3.5+

创建和运行项目

创建一个项目:

django-admin startproject HelloWorld
创建完成后我们可以查看下项目的目录结构:

$ cd HelloWorld/
$ tree
.
|-- HelloWorld
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- manage.py

目录说明:

  • HelloWorld: 项目的容器。
  • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • HelloWorld/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
  • HelloWorld/settings.py: 该 Django 项目的设置/配置。
  • HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  • HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

接下来我们进入 HelloWorld 目录输入以下命令,启动服务器:

python manage.py runserver 0.0.0.0:8000

Pycharm创建Django工程

首先安装专业版pycharm,破解方法:
https://www.jianshu.com/p/261b445fae05
File-->New Project-->Django创建工程:

视图和 URL 配置

创建view.py,加入以下代码:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Welcome ! ")

接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

from django.conf.urls import url
 
from . import view
 
urlpatterns = [
    url(r'^$', view.hello),
]

url()函数:
Django url() 可以接收四个参数,分别是两个必选参数:regex、view 和两个可选参数:kwargs、name,接下来详细介绍这四个参数。

  • regex: 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。
  • view: 用于执行与正则表达式匹配的 URL 请求。
  • kwargs: 视图使用的字典类型的参数。
  • name: 用来反向获取 URL。

Django模板

上面使用 django.http.HttpResponse() 来输出 "Welcome!"。该方式将数据与视图混合在一起,不符合 Django 的 MVC 思想。
现在介绍 Django 模板的应用,模板是一个文本,用于分离文档的表现形式和内容。

  • 通过settings.py向Django说明模板文件的路径;
  • 新建html文件:



    
    {{ welcome}}


{{ welcome}}


模板中我们知道变量使用了双括号。

  • 修改view.py,增加一个新的对象,用于向模板提交数据:
# -*- coding: utf-8 -*-

# from django.http import HttpResponse
from django.shortcuts import render

def hello(request):
    context = {}
    context['welcome'] = 'Welcome !'
    return render(request, 'welcome.html', context)

这里使用 render 来替代之前使用的 HttpResponse。render 还使用了一个字典 context 作为参数。

context 字典中元素的键值 "welcome" 对应了模板中的变量 "{{ welcome}}"。

  • urls.py修改为:
from django.conf.urls import url
from . import view

urlpatterns = [
    url(r'^welcome$', view.welcome),
]

再访问访问 http://127.0.0.1:8000/welcome,可以看到页面:

Django模板标签

  • if/else标签
    语法如下:
{% if condition1 %}
   ... display 1
{% elif condition2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not )

  • for标签
    {% for %} 允许我们在一个序列上迭代。

与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:

    {% for athlete in athlete_list %}
  • {{ athlete.name }}
  • {% endfor %}

给标签增加一个 reversed 使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}
...
{% endfor %}
  • ifequal/ifnotequal 标签
    {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}
    

Welcome!

{% endifequal %}

和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:

{% ifequal section 'sitenews' %}
    

Site News

{% else %}

No News Here

{% endifequal %}
  • 注释标签
    Django 注释使用 {# #}。
{# 这是一个注释 #}
  • include 标签
    {% include %} 标签允许在模板中包含其它的模板的内容。

下面这个例子都包含了 nav.html 模板:

{% include "nav.html" %}
  • 过滤器
    模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:
{{ name|lower }}
{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

{{ my_list|first|upper }}
以上实例将第一个元素并将其转化为大写。

有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:

{{ bio|truncatewords:"30" }}
这个将显示变量 bio 的前30个词。

其他过滤器:
addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。
date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:

{{ pub_date|date:"F j, Y" }}
length : 返回变量的长度。

模板继承

模板可以用继承的方式来实现复用。
接下来先创建之前项目的 templates 目录中添加 base.html 文件,代码如下:

HelloWorld/templates/base.html 文件代码:




base


    

Welcome!

Django 测试。

{% block mainbody %}

original

{% endblock %}

以上代码中,名为 mainbody 的 block 标签是可以被继承者们替换掉的部分。

所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。

welcome.html 中继承 base.html,并替换特定 block,welcome.html 修改后的代码如下:

HelloWorld/templates/welcome.html 文件代码:

{%extends "base.html" %}
 
{% block mainbody %}

继承了 base.html 文件

{% endblock %}

第一行代码说明 welcome.html 继承了 base.html 文件。可以看到,这里相同名字的 block 标签用以替换 base.html 的相应 block。

重新访问地址 http://127.0.0.1:8000/welcome,输出结果如下:

Django 模型

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。
待完善

Django 表单

  • HTTP 请求
    HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。
  • GET方法
    创建一个search.py文件,用于接收用户的请求:
# -*- coding: utf-8 -*-

from django.http import HttpResponse
from django.shortcuts import render_to_response


# 表单
def search_form(request):
    return render_to_response('search_form.html')

# 接收请求数据
def search(request):
    request.encoding = 'utf-8'
    if 'q' in request.GET:
        message = '你搜索的内容为: ' + request.GET['q']
    else:
        message = '你提交了空表单'
    return HttpResponse(message)

在模板目录 templates 中添加 search_form.html 表单:




    
    search_form


    

urls.py 规则修改为如下形式:

from django.conf.urls import url
from . import view,search

urlpatterns = [
    url(r'^welcome$', view.welcome),
    url(r'^search-form', search.search_form),
    url(r'^search', search.search),
]
  • POST方法
    上面我们使用了GET方法。视图显示和请求处理分成两个函数处理。

提交数据时更常用POST方法。我们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。

我们在 templates 创建 post.html:




    
    post


    
{% csrf_token %}

{{ rlt }}

在模板的末尾,我们增加一个 rlt 记号,为表格处理结果预留位置。

表格后面还有一个{% csrf_token %}的标签。csrf 全称是 Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。
urls.py 规则修改为如下形式:

from django.conf.urls import url
from . import view,search

urlpatterns = [
    url(r'^welcome$', view.welcome),
    url(r'^search-form', search.search_form),
    url(r'^search', search.search),
    url(r'^post', search.post),
]

Request对象

你可能感兴趣的:(【python】Web应用框架Django)