Python-django框架(一)

django框架简介

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原则。

特点:

对比Flask框架,Django原生提供了众多的功能组件,让开发更简便快速。
提供项目工程管理的自动化脚本工具
数据库ORM支持(对象关系映射,英语:Object Relational Mapping)
模板
表单
Admin管理站点
文件管理
认证权限
session机制
缓存

在这里插入图片描述

工程搭建

创建工程:django-admin startproject 工程名称
工程目录说明:与项目同名的目录,此处为demo。
			settings.py 是项目的整体配置文件。
			urls.py 是项目的URL配置文件。
			wsgi.py 是项目与WSGI兼容的Web服务器入口。
			manage.py 是项目管理文件,通过它管理项目。

在这里插入图片描述
运行开发服务器:

运行服务器代码:python manage.py runserver ip:端口
或   python manage.py runserver
可以不写ip和端口,默认的ip和端口为127.0.0.1:8000
django默认工作室在调试debug的模式下进行了,每次增加修改删除文件,服务器就会重启。Ctrl +c可以停止服务器。

创建子应用

Django中的视图编写是在子应用中的,Flask中也有类似子功能应用模块的概念,即蓝图。
创建: python manage.py startapp 子应用名称
子应用目录说明:
	admin.py 文件跟网站的后台管理站点配置相关。
	apps.py 文件用于配置当前子应用的相关信息。
	migrations 目录用于存放数据库迁移历史文件。
	models.py 文件用户保存数据库模型类。
	tests.py 文件用于开发测试用例,编写单元测试。
	views.py 文件用于编写Web应用视图。 

在这里插入图片描述
注册安装子应用

创建出来的子应用虽然放在了工程项目目录中,但是django工程并不能直接使用,需要注册安装后才行。
在工程配置的settings.py文件中,INSTALLED_APPS项保存了过程中已经注册安装的子应用。

在这里插入图片描述

注册安装一个子应用的方法,就是将子应用的配置文件app.py中的config类添加到INSTALLED_APPS列表中。

创建视图

同flask框架一样,django也是通过视图来编写web应用的业务逻辑,存在于子应用的views中.py。
创建:
from django.http import HttpResponse

def index(request):
    """
    index视图
    :param request: 包含了请求信息的请求对象
    :return: 响应对象
    """
    return HttpResponse("hello world!")
说明:视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对象,通常名为request。
视图函数的返回值必须为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。
定义路由url:
1)在子应用中创建一个url.py文件用于保存该应用的路由。
2)定义路由
	from django.conf.urls import url

	from . import views
	
	# urlpatterns是被django自动识别的路由列表变量
	urlpatterns = [
	    # 每个路由信息都需要使用url函数来构造
	    # url(路径, 视图)
	    url(r'^index/$', views.index),
	]
3)在工程总路由里面添加添加子应用的路由程序
	
	from 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)),  # 添加应用的路由
	]

配置

1)BASE_DIR:
	BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
	获取当前工程的根目录,Django会依次来定位工程内的相关文件,我们可以采用此参数来构造文件路径。
2)DEBUG
	调试模式,创建工程后默认为True。
3)本地语言和时区
默认设置为:
	LANGUAGE_CODE = 'en-us'  # 语言
	TIME_ZONE = 'UTC'  # 时区
将语言和时区修改为中国大陆信息	
	LANGUAGE_CODE = 'zh-hans'
	TIME_ZONE = 'Asia/Shanghai'

请求

利用http协议向服务器传递参数的方式主要有四种:
1)URL路径参数
	未命名参数按定义顺序传递, 如

	url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),
	
	def weather(request, city, year):
	    print('city=%s' % city)
	    print('year=%s' % year)
	    return HttpResponse('OK')
	命名参数按名字传递,如
	
	url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),
	
	def weather(request, year, city):
	    print('city=%s' % city)
	    print('year=%s' % year)
	    return HttpResponse('OK')
2)查询字符串
	获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。

# /qs/?a=1&b=2&a=3

def qs(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    alist = request.GET.getlist('a')
    print(a)  # 3
    print(b)  # 2
    print(alist)  # ['1', '3']
    return HttpResponse('OK')
重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。		
3)请求体
如果是表单数据:
	前端发送的表单类型的请求体数据,可以通过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来获取请求体的表单数据。
如果是非表单数据:
	非表单类型的请求体数据,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')
4)请求头
		可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
5)其余的请求对象属性
    	method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
	user:请求的用户对象。
	FILES:一个类似于字典的对象,包含所有的上传文件。

响应

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。
1)HttpResponse
	可以使用django.http.HttpResponse来构造响应对象。
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
 2)JsonResponse
 	若要返回json数据,可以使用JsonResponse来构造响应对象,作用:
 	1.帮助我们将数据转化为json字符串
 	2.设置响应头Content_type为application/json
 3)redirect(重定向)
 	from django.shortcuts import redirect

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

Cookie

设置cookie:
	可以通过HttpResponse对象中的set_cookie方法来设置cookie。
	HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
	max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。
读取cookie
	可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。

Session

session信息是默认存储在关系型数据库中的。可以修改存储位置。如redis
在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。

1) 安装扩展

pip install django-redis
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"

Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

1) 以键值对的格式写session。

request.session['键']=值
2)根据键读取值。

request.session.get('键',默认值)
3)清除所有session,在存储中删除值部分。

request.session.clear()
4)清除session数据,在存储中删除session的整条数据。

request.session.flush()
5)删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']
6)设置session的有效期

request.session.set_expiry(value)
如果value是一个整数,session将在value秒没有活动后过期。
如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。

猜你喜欢

转载自blog.csdn.net/weixin_43617255/article/details/84488064