首页 > Python笔记 阅读数:22

Python Django框架用法完全攻略

Django 是一个免费开源高级的 Web 网站框架。是用 Python 编写的,下面就来进行具体介绍。

Django框架的第一个程序——Hello World

使用框架创建 HeIIoWorId 项目,具体代码如下:

django-admin startproject HelloWorld


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

启动服务器,具体代码如下:
#启动服务器
python manage.py runserver 0.0.0.0:8000

此时访问http://127.0.0.1:8000/,就会看到如图 1 所示的内容,说明项目启动成功。


图 1:项目启动成功

Django框架的应用

1) 路由与构造URL

首先在 HelloWorld 项目中创建一个视图函数 views.py,引入 HttpResponse,它是用来向网页返回内容的,就像 Python 中的 print 一样,只不过 HttpResponse 负责把内容显示到网页上。

路由构造与实现,具体代码如下:
from django.http import HttpResponse
def hello(request):
    return HttpResponse("Hello world!")

在路由文件 urls.py 中输入如下代码:
from django.conf.urls import url
from.import views
urlpatterns =[
    url(r '^$', views.hello)
]
之后在 urls.py 中修改函数。

url( ) 函数可以接收 4 个参数,分别是两个必选参数 regex、view 和两个可选参数 kwargs、name。

2) Request对象的基本使用

在每个视图函数中都会先引用 Request 对象,它是每个视图函数的第一个参数,其基本属性如表 2 所示。

表 2:Request 对象的基本属性
属性 描述
path 请求页面的全路径,不包括域名。例如,"/hello/"
method
请求中使用的 HTTP 方法的字符串表示。全大写表示。例如: 
if request.method = 'GET':
    do_something()
elif request.met hod = 'POST':
    do_something_else()
GET 包含所有 HTTP GET 参数的类字典对象
POST
包含所有 HTTP POST 参数的类字典对象。
服务器接收到空的 POST 请求的情况也是有可能发生的。也就是说,表单通过 HTTP POST 方法提交请求,但在表单中可以没有数据。因此,不能使用语句 if request.POST 来判断是否使用了 HTTP POST 方法,而应该使用语句 if request.method = "POST"(参见本表的method属性)
注意:POST 属性不包括 file-upload 信息

3) GET和POST请求传参

我们在前面学习了 Flask 中提交表单的方式,那么,在 Django 中是怎么提交表单的呢?接下来进行演示。

首先在 helloworld/helloworld/views.py 中添加如下代码(注意:在这里引用了 templates/test.html,需要在 setting 中设置 TEMPLATES 下的 DIRS 为 [os.path.join(BASE_DIR,'templates')],目的就是在使用 test.html 的时候能找到相应的路径)。

GET 与 POST 请求传参,具体代码如下:
from django.http import HttpResponse
from django.shortcuts import render_to_response
#表单页面
def test_form(request):
    return render_to_response("test.html")
#接收及处理表单请求数据
def test(request):
    request.encoding='utf-8'
    if request.method=="GE'T":
        message ='你的方式为get '
    elif request.method=="POST":
        message = '你的方式为post'
    else:
        message="未识别!"
    return HttpResponse(message)

然后在 helloworld/templates 目录下创建一个 HTML 文件 test.html。代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
    <p>get 请求</p>
    <form action="/search-get" method="get">
        <input type="text">
        <input type="submit" value="Submit">
    </form>
    <p>post 请求</p〉
    <form action="/search-post" method="post">
        <input type="text" >
        <input type="submit" value="Submit">
    </form>
</body>
</html>

最后在 helloworld/helloworld/urls.py 中添加对 URL 请求的处理。代码如下:
from django.conf.urls import include, url
from django.contrib import admin
from django.conf.urls import url
from.import views

urlpatterns =[
    url (r'^search$', views.test_form),
    url (r'^search-post$', views.test),
    url (r'^search-get$', views.test),
]

注意:在提交表单时,如果直接提交,则会产生 CSRF 错误。此时先采用禁用的方式,即在 setting 中将 MIDDLEWARE_CLASSES 中的一个中间件 'django.middleware.csrf.CsrfViewMiddleware' 注释掉。

4) CSRF的问题

CSRF 的全称是 Cross Site Request Forgery。这是 Django 提供的防止伪装提交请求的功能。第一种解决方法就是将上文的中间件设置中的一项注释掉。第二种解决方法就是在 post 代码中添加{%csrf_token%}(注意:要首先在 views.py 中添加如下代码)。

CSRF 设置演示,具体代码如下:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def some_view(request):
    #..

并且在前端页面中加入如下代码:
<form action="/search-post" method="post">
    {% csrf_token %}
    <input type="text" >
    <input type="submit"  value="Submit">
</form>

5) Cookie与Session在Django中的应用

关于 Cookie 与 Session 的定义,在 Flask 中已经进行了阐述,接下来直接看看在 Django 中如何应用。

① Cookie 的应用:
Cookie 在 Django 中的增、删、改、查,具体代码如下:
from django.shortcuts import
render, HttpResponse, redirect, HttpResponseRedirect
from tools.resis_handler import connect_obj

def login(request):
    resp = redirect('/list_display/')
    resp.set_cookie ('k', 'a' )    #设置 Cookie 的值
    return resp

#将Cookie的值展现出来
def display(request):
    print(request.COOKIES['K'])
    return HttpResponse('0K')

② Session 的应用
在操作 Session 之前,需要同步一下 Django 的数据库,具体代码如下:
python manage.py makemigrations
python manage.py migrate

③ 在 Django 中操作 Session:
在 Django 中操作 Session,具体代码如下:
def login(request):
    if request.method =='POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        if username =='lisi' and pwd == '12345':
            request.session['IS_LOGIN'] = True #设置 Session
        return redirect('/home/')
    return render(request, 'login.html')

def home(request):
    #获取 Session 里的值
    is_login = request.session.get('IS_LOGIN', False)
    if is_login:
        return HttpResponse('order')
    else :
        return redirect('/login/')

6) 模板的渲染

模板中的判断条件与循环语句等基本操作之前已有讲解,接下来讲解模板在 Django 中是如何被渲染的。主要通过 render( ) 函数来实现模板的渲染。

具体代码如下:
#views.py
from app.models import Author  #引入一个类
def query(request):
    #result=Author.objects.all()
    #返回数据库查询结果(sql:select * from Author ),list类型
    result=Author.objects.values_list()
    return render(#将返回的数据渲染到页面中
        request,
        'query.html',
        {
            'title' : 'Query', #将查询结果渲染到 app/query.html 中的变量 result 中
            'result':result,
            'year':datetime.now().year,
        }
        )
通过上述的 render( ) 函数,就能将变量传递给 HTML 进行渲染,以达到我们想要的效果。

相关文章