Django框架知识1(工程搭建,配置,请求与响应[cookie.session])

本文详细介绍了Django框架的宗旨、特点,包括项目搭建、子应用创建、视图与URL配置、静态文件处理、请求与响应机制,特别是Cookie和Session的使用。Django提供了方便的管理工具和ORM,支持模板、表单和认证权限等功能,是快速开发Web应用的强大框架。
摘要由CSDN通过智能技术生成

一、Django介绍

1. Django宗旨:

Django makes it easier to build better Web apps more quickly and with less code.

2.特点:

    重量级框架

提供项目工程管理的自动化脚本工具

数据库ORM支持(对象关系映射,英语:Object Relational Mapping)

模板

表单

Admin管理站点

文件管理

认证权限

session机制

缓存

3.Django学习资料


二、工程搭建

1.环境安装

1.1创建虚拟环境

mkvirtualenv django_py3_1.11 -p python3

1.2安装Django

pip install django==1.11.11
1.3复习虚拟环境和pip的命令

# 虚拟环境
mkvirtualenv  # 创建虚拟环境
rmvirtualenv  # 删除虚拟环境
workon  # 进入虚拟环境、查看所有虚拟环境
deactivate  # 退出虚拟环境

# pip
pip install  # 安装依赖包
pip uninstall  # 卸载依赖包
pip list  # 查看已安装的依赖包
pip freeze  # 冻结当前环境的依赖包


2.创建工程

在django中,项目工程目录可以借助django提供的命令帮助我们创建

2.1创建工程的命令为:

django-admin startproject 工程名称
2.2  例如:想要在桌面的code目录中创建一个名为demo的项目工程,可执行如下命令:

cd ~/Desktop/code
django-admin startproject demo

创建成功后

与项目同名的目录,此处为demo

    settings.py 是项目的整体配置文件

    urls.py 是项目的URL配置文件

    wsgi.py 是项目与WSGI兼容的Web服务入口

    manage.py 是项目管理文件,通过他管理项目

2.3 Django默认工作在调试Debug模式下,如果增加、修改、删除文件,服务器会自动重启。

      按ctrl+c停止服务器

3.创建子应用

在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该模块代码整体复制过去,达到复用。

3.1创建

在django中,创建子应用模块目录仍然可以通过命令来操作,即

python manage.py startapp 子应用名称
例如,在刚才创建的demo工程中,想要创建一个用户子应用模板,可执行:

cd ~/Desktop/code/demo
python manage.py startapp users

执行后,可以看到工程目录中多出了一个名为users的子目录



  • admin.py 文件跟网站的后台管理站点配置相关。
  • apps.py 文件用于配置当前子应用的相关信息。
  • migrations 目录用于存放数据库迁移历史文件。
  • models.py 文件用户保存数据库模型类。
  • tests.py 文件用于开发测试用例,编写单元测试。
  • views.py 文件用于编写Web应用视图。
4.注册安装子应用

创建出来的子应用目录文件虽然被放到了工程项目目录中,但是django工程并不能立即直接使用该子应用,需要注册安装后才能使用。

在工程配置文件settings.py中,INSTALLED_APPS项保存了工程中已经注册安装的子应用,初始工程中的INSTALLED_APPS如下:


注册安装一个子应用的方法,即是将子应用的配置信息文件apps.py中的Config类添加到INSTALLED_APPS列表中。

例如,将刚创建的users子应用添加到工程中,可在INSTALLED_APPS列表中添加'users.apps.UsersConfig'


5.创建视图

同Flask框架一样,Django也用视图来编写Web应用的业务逻辑。

Django的视图是定义在子应用的views.py中的。

5.1创建

打开刚创建的users模板,在views.py中编写视图代码。

from django.http import HttpResponse

def index(request):
    """
    index视图
    :param request: 包含了请求信息的请求对象
    :return: 响应对象
    """
    return HttpResponse("hello the world!")

说明:

视图函数的第一个参数必须定义,用于接受Django构造的包含了请求数据的HttpReqeust对象,通常名为request

视图函数的返回值必须作为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。

5.2 定义路由URL

(1)在子应用中新建一个url.py文件用于保存该应用的路由。


(2)在users/urls.py文件中定义路由信息。

from django.conf.urls import url

from . import views

# urlpatterns是被django自动识别的路由列表变量
urlpatterns = [
    # 每个路由信息都需要使用url函数来构造
    # url(路径, 视图)
    url(r'^index/$', views.index),
]

(3)在工程总路由demo/urls.py中添加子应用的路由数据。

rom django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),  # django默认包含的

    # 添加
    url(r'^users/', include('users.urls')), 
]
  • 使用include来将子应用users里的全部路由包含进工程路由中;
  • r'^users/' 决定了users子应用的所有路由都已/users/开头,如我们刚定义的视图index,其最终的完整访问路径为/users/index/

include函数除了可以传递字符串之外,也可以直接传递应用的urls模块,如

from django.conf.urls import url, include
from django.contrib import admin
import users.urls  # 先导入应用的urls模块

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # url(r'^users/', include('users.urls')),
    url(r'^users/', include(users.urls)),  # 添加应用的路由
]

6.启动运行

重新启动django程序

python manage.py runserver
在浏览器中输入网址 127.0.0.1:8000/users/index/  可看到返回的信息


6.配置、静态文件与路由

6.1配置文件

BASE_DIR

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

6.2 DEBUG

注意:部署线上运行的Django不要运行在调试模式下,记得修改

DEBUG = Flase

6.3本地语言与时区

初始化的工程默认和时区为英语和UTC标准时区

LANGUAGE_CODE = 'en-us'  # 语言
TIME_ZONE = 'UTC'  # 时区

将语言和时区修改为中国大陆信息

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'


6.3静态文件

(1)在项目根目录下创建static_files目录来保存静态文件。

(2)在demo/settings.py中修改静态文件的两个参数为

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static_files'),
]

6.4路由说明




6.5路由定义位置

Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。

每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存该应用的路由。然后用主路由文件包含各应用的子路由数据。

6.6 APP应用配置

在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。

from django.apps import AppConfig

class UsersConfig(AppConfig):
    name = 'users'
AppConfig.verbose_name  属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示,如

from django.apps import AppConfig

class UsersConfig(AppConfig):
    name = 'users'
    verbose_name = '用户管理'

7.请求与响应

 请求Request

7.1请求体

请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。

可以发送请求体数据的请求方式有POSTPUTPATCHDELETE

Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,如:



7.2 表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。

def get_body(request):
    a = request.POST.get('a')
    b = request.POST.get('b')
    alist = request.POST.getlist('a')
    print(a)
    print(b)
    print(alist)
    return HttpResponse('OK')

重要:只要请求体的数据是表单类型,无论是哪种请求方式(POST、PUT、PATCH、DELETE),都是使用request.POST来获取请求体的表单数据。

非表单类型 Non-Form Data

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。

例如要获取请求体中的如下JSON数据

{"a": 1, "b": 2}

可以进行如下方法操作

import json

def get_body_json(request):
    json_str = request.body
    json_str = json_str.decode()  # python3.6 无需执行此步
    req_data = json.loads(json_str)
    print(req_data['a'])
    print(req_data['b'])
    return HttpResponse('OK')

7.3请求头

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型

常见的请求头如:

  • CONTENT_LENGTH – The length of the request body (as a string).
  • CONTENT_TYPE – The MIME type of the request body.
  • HTTP_ACCEPT – Acceptable content types for the response.
  • HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
  • HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
  • HTTP_HOST – The HTTP Host header sent by the client.
  • HTTP_REFERER – The referring page, if any.
  • HTTP_USER_AGENT – The client’s user-agent string.
  • QUERY_STRING – The query string, as a single (unparsed) string.
  • REMOTE_ADDR – The IP address of the client.
  • REMOTE_HOST – The hostname of the client.
  • REMOTE_USER – The user authenticated by the Web server, if any.
  • REQUEST_METHOD – A string such as "GET" or "POST".
  • SERVER_NAME – The hostname of the server.
  • SERVER_PORT – The port of the server (as a string).

具体使用如下:

def get_headers(request):
    print(request.META['CONTENT_TYPE'])
    return HttpResponse('OK')

8.响应

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

8.1 HttpResponse

可以使用django.http.HttpResponse来构造响应对象。

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

8.2 HttpResponse子类

Django提供了一系列HttpResponse的子类,可以快速设置状态码

  • HttpResponseRedirect 301
  • HttpResponsePermanentRedirect 302
  • HttpResponseNotModified 304
  • HttpResponseBadRequest 400
  • HttpResponseNotFound 404
  • HttpResponseForbidden 403
  • HttpResponseNotAllowed 405
  • HttpResponseGone 410
  • HttpResponseServerError 500

8.3 JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象

from django.http import JsonResponse

def demo_view(request):
    return JsonResponse({'city': 'beijing', 'subject': 'python'})

8.4 redirect 重定向

from django.shortcuts import redirect

def demo_view(request):
    return redirect('/index.html')


9  cookie

Cookie的特点
  • Cookie以键值对的格式进行信息的存储。
  • Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息。
  • 当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器。

9.1 设置cookie

可以通过 HttpResponse对象中的set_cookie方法来设置cookie

HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
  • max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。
def demo_view(request):
    response = HttpResponse('ok')
    response.set_cookie('a', 'python1')  # 临时cookie
    response.set_cookie('b', 'python2', max_age=3600)  # 有效期一小时
    return response

9.2读取cookie

可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型

def demo_view(request):
    cookie1 = request.COOKIES.get('a')
    print(cookie1)
    return HttpResponse('OK')


10 session

10.1存储方式

在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。

10.2数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式

SESSION_ENGINE='django.contrib.sessions.backends.db'

10.3本地缓存

存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'
10.4混合存储

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
10.5 Redis

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。

    10.5.1 安装扩展

pip install django-redis

    10.5.2 配置

在settings.py文件中做如下配置

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

10.6 Session操作

10.6.1  以键值对的格式写session

request.session['键']=值
10.6.2 根据键读取值
request.session.get('键',默认值)
10.6.3  清除所有session,在存储中删除值部分。

request.session.clear()

10.6.4 清除session数据,在存储中删除session的整条数据。

request.session.flush()

10.6.5 删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

10.6.6 设置session的有效期

request.session.set_expiry(value)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值