Django-01
Web框架1.Web应⽤程序处理流程 :
2.Web框架的意义 1.⽤于搭建Web应⽤程序 2.免去不同Web应⽤相同代码部分的重复编写,只需关⼼Web应⽤核⼼的业务逻辑实现 3.Web应⽤程序的本质 1.接收并解析HTTP请求,获取具体的请求信息 2.处理本次HTTP请求,即完成本次请求的业务逻辑处理 3.构造并返回处理结果——HTTP响应 4.如何学习Web框架说明:
Django框架介绍 1.简介和特点 1.简介: 是⽤python语⾔写的开源web开发框架,并遵循MVC设计。 Django的 主要⽬的是简便、快速的开发数据库驱动的⽹站。 2.特点 重量级的Web框架,功能⻬全 遵循MVC设计 2.设计模式 MVC MVC,其核⼼思想是分⼯、解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。 M 全拼为Model,主要封装对数据库层的访问,对数据库中的数据进⾏增、删、改、查操作。 V 全拼为View,⽤于封装结果,⽣成⻚⾯展示的html内容。 C 全拼为Controller,⽤于接收请求,处理业务逻辑,与Model和 View交互,返回结果。 MVT M 全拼为Model,与MVC中的M 功能相同,负责和数据库交互,进⾏数据处理。 V 全拼为View,与MVC中的C 功能相同,接收请求,进⾏业务处理,返回应答。 T 全拼为Template,与MVC中的V 功能相同,负责封装构造要返回的html。 3.相关⽂档 官⽅⽹站 https://www.djangoproject.com/ GitHub源码 https://github.com/ django/ django 中⽂版⽂档 https://yiyibooks.cn/xx/Django_1.11.6/index.html搭建Django⼯程 1.安装Django框架 创建虚拟环境 mkvirtualenv 虚拟环境名字 -p python3 安装框架 pip install django==1.11.11 2.创建Django⼯程⽬录 命令 django-admin startproject ⼯程名称 步骤 进⼊要创建⼯程的⽬录 django-admin startproject demo 启动测试服务器 python manage.py runserver 3.创建Django⼦应⽤ 说明 Django的视图编写是放在⼦应⽤中的。 命令 python manage.py startapp ⼦应⽤名称 步骤 进⼊到项⽬⽬录中 python manage.py startapp users 安装⼦应⽤
INSTALLED_APPS = [ ' django.contrib.admin' , ' django.contrib.auth' , ' django.contrib.contenttypes' , ' django.contrib.sessions' , ' django.contrib.messages' , ' django.contrib.staticfiles' , 'users.apps.UsersConfig', # 安装users应⽤ ]
4.创建视图并定义路由 1.总路由⼊⼝ ROOT_URLCONF = 'demo.urls' 2.总路由定义 demo.urls
urlpatterns = [ url(r'^admin/', admin.site.urls), # 将 users应⽤中的所有路由包含进来 url(r'^users/', include('users.urls')),]
3.⼦路由定义 Users.urls
urlpatterns = [ # url(r'^路径$', views.视图), url(r'^index/$', views.index), ]
4.视图定义 users.views
def index(request):"""定义django函数视图:param request: 传⼊到函数视图的请求对象:return: 响应对象""" return HttpResponse('hello world')
配置⽂件、静态⽂件、路由说明 1.settings.py配置⽂件说明 2.静态⽂件使⽤ 1.配置静态⽂件的访问 # 静态⽂件访问的路由 STATIC_URL = '/static/' # 配置静态⽂件加载⽬录 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static_files') ] 2.准备静态⽂件1 项⽬根路径/静态⽂件夹/静态⽂件 项⽬根路径/static_files/index.html http://127.0.0.1:8000/static/index.html 3.准备静态⽂件2 项⽬根路径/static_files/goods/detail.html http://127.0.0.1:8000/static/goods/index.html 3.路由的使⽤ 1.Django解析路由的流程 :
2.路由定义位置
1.总路由+⼦路由 总路由 url(r'^users/', include('users.urls')), ⼦路由 url(r'^index/$', views.index), 2.总路由 url(r'^users/index/$', views.index), 3.⼦路由 总路由 url(r'^', include('users.urls')), ⼦路由 url(r'^users/index/$', views.index), 3.路由解析的顺序 1.urlpatterns⾥⾯的路由解析的顺序 ⾃上⽽下 urlpatterns = [ # url(r'^路径$', views.视图), url(r'^index/$', views.index, name= 'index'), # 以下代码演示路由⾃上⽽下匹配规则 # url(r'^say', views.say), # 这个会拦截下⾯的路由 # url(r'^sayhello', views.say_hello), url(r'^say$', views.say), # 定义路由要指明开始和结束 url(r'^sayhello$', views.say_hello), ] 2.结论 ⼦路由需要有开始和结尾 4.路由命名空间和reverse反解析 1.定义命名空间 url(r'^users/', include('users.urls', namespace= 'users')), url(r'^index/$', views.index, name= 'index'), 2.使⽤反向解析 'users/index/' url = reverse('users:index') 5.路径以斜线结尾说明 1.正则匹配路由结尾带斜线,如果⽤户输⼊的URL路径没有斜线,当找不到该路由时 浏览器会⾃动的重定向到带斜线的路由 2.正则匹配路由结尾不带斜线,如果⽤户输⼊的URL路径有斜线,直接报404错误请求对象: 1.利⽤HTTP协议向服务器传参的⼏种途径 请求⾏中的路径 查询字符串 请求体 请求头 2.使⽤正则提取URL中参数 1.位置参数 # url(r'^weather1/([a-z]+)/(\d{4})/$', views.weather), def weather1(request, city, year): """读取正则中的组提取的参数""" print( 'city=%s' % city) print( 'year=%s' % year) return HttpResponse('OK') 2.关键字参数 # url(r'^weather2/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather2), def weather2(request, year, city): """读取正则中的关键字提取的参数""" print( 'city=%s' % city) print( 'year=%s' % year) return HttpResponse('OK') 3.提取查询字符串参数 1.需求 提取问号后⾯的查询字符串 /weather3/beijing/2018/?a=10&b=20&a=30 2.属性 GET request.GET 返回QueryDict类型的对象 3.QueryDict类型 可以存储⼀键⼀值和⼀键多值 提供get()⽅法 读取⼀键⼀值 提供getlist()⽅法 读取⼀键多值 4.代码演练 # /weather3/beijing/2018/?a=10&b=20&a=30 def weather3(request, year, city): """提取查询字符串参数""" print( 'city=%s' % city) print( 'year=%s' % year) a = request.GET.get('a') b = request.GET.get('b') a_list = request.GET.getlist( 'a') print( a,b,a_list) return HttpResponse('OK') 4.提取请求体中的参数 1.提取请求体中的表单数据 1.属性 POST request.POST 返回QueryDict类型的对象 2.代码演练
# url(r'^get_body_form/$', views.get_body_form),def get_body_form(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')
2.提取请求体中的⾮表单数据 1.属性 body request.body 2.代码演练
# url(r'^get_body_json/$', views.get_body_json),# {"a": 1, "b": 2}def get_body_json(request):"""演示获取请求体中的⾮表单数据""" print(request.META['CONTENT_TYPE']) print(request.method, request.path) json_str = request.body json_str = json_str.decode() req_data = json.loads( json_str) print(req_data['a']) print(req_data['b']) return HttpResponse('OK')
5.提取请求头中的信息 1.提取⽅案 2.代码实现 print(request.META['CONTENT_TYPE']) 6.其他请求报⽂信息 print(request.method, request.path)
响应对象: 1.HttpResponse 1.常规⽤法 # HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码) # 注意点:响应体参数是必传的 return HttpResponse('OK', content_type= 'text/html', status= 200) 2.⾃定义响应头 # 创建响应对象 response = HttpResponse('OK', content_type= 'text/html', status= 200) # ⾃定义响应头:键值对;⾃定义响应头键 Itcast, 值 Python response[' subject' ] = 'Python' return response 2.JsonResponse
# GET /response_json/ (表示⽤户向我们索取json)def response_json(request):"""响应json数据""" # 准备字典: json字符串的key,需要双引号 json_dict = {"name": " python" , "age": 25} # 默认会设置状态码 # 默认会将数据类型设置为 Content-Type: application/json # 默认会将json字典转json字符串, 再将json字符串转⼆进制响应给⽤户 return JsonResponse( json_dict)
3.重定向 # GET /response_redirect/ def response_redirect(request): """重定向""" # 需求:重定向到users应⽤的index视图 # 使⽤最原始的⽅式 # return redirect('/users/index/') # 使⽤反向解析实现重定向 return redirect(reverse('users:index')) 4.render 响应模板数据的,后续模板时会使⽤响应模板数据的,后续模板时会使⽤
相关源码连接: