第一章 django安装与介绍
第二章 django基础使用
第三章 路由层
第四章 虚拟环境、django版本区别、视图层
第五章 模板层
第六章 模型层
诸多项目在你的机器上如何无障碍的打开并运行
方式1:把所有需要用到的模块全部下载下来 如果有相同模块不同版本每次都重新下载替换
方式2:提前准备好多个解释器环境 针对不同的项目切换即可
此处可以使用pycharm创建新的环境变量
django1.x与2.x、3.x有些许区别
路由层中:
1.x 的urls可以使用正则
2.x、3.x提供的path只能绑定url与对应视图函数
但re_path与1.x的urls具有一样的功能,甚至正则中的分组是可以指定类型的。
1.x的urls中正则中的分组只能为字符串变量
urls(r"^index/(?P\w*)" , views.index) #此处的username为str
2.x、3.x之中的path提供了转换器用来替代正则中的无名有名分组,并且转换器可以定制变量的类型
path("index/" , views.index) #此处的num为int
django针对转换器提供了五种供path使用
视图函数必须返回一个HttpResponse对象
视图层中返回HttpResponse对象的方法有三个HttpResponse、render、redirect
HttpResponse方法返回的对象就是HttpResponse对象,该方法是HttpResponse对象自己。
class HttpResponse(HttpResponseBase):
....
render方法返回的对象就是HttpResponse对象。
def render(request, template_name, context=None, content_type=None, status=None, using=None):
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
redirect方法返回的对象是HttpResponse对象。
def redirect(to, *args, **kwargs):
if kwargs.pop('permanent', False):
redirect_class = HttpResponsePermanentRedirect
else:
redirect_class = HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs))
class HttpResponsePermanentRedirect(HttpResponseRedirectBase):
status_code = 301
class HttpResponseRedirect(HttpResponseRedirectBase):
status_code = 302
class HttpResponseRedirectBase(HttpResponse): #通过查看源代码知道redirect最终返回的还是HttpResponse对象
django对json序列化的数据类型的范围做了扩充,从而诞生了JsonResponse,通过查看源码可以了解到django框架也是使用基础的json来实现的。
class JsonResponse(HttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
if json_dumps_params is None:
json_dumps_params = {}
kwargs.setdefault('content_type', 'application/json')
data = json.dumps(data, cls=encoder, **json_dumps_params)#此处对json进行了扩充
super(JsonResponse, self).__init__(content=data, **kwargs)
该方法用于获取请求的类型,获取的值为大写的
获取POST请求附带的数据,附带的数据为字典类型
request.POST["name"] # 获取对应的值
request.POST.get("name") # 获取对应的值
request.POST.getlist("name") # 获取对应的值,但类型为list
获取url中?后的参数
request.GET["name"] # 获取对应的值
request.GET.get("name") # 获取对应的值
request.GET.getlist("name") # 获取对应的值,但类型为list
form表单上传的数据中如果含有文件 那么需要做以下几件事
file_obj = request.FILES # 获取文件数据
file_obj.get("file") # 获取其中的一个文件
file_obj["file"] # 获取其中的一个文件
file_obj["file"].name # 获取文件的文件名
存放的是接收过来的最原始的二进制数据,request.POST、request.GET、request.FILES这些获取数据的方法其实都从body中获取数据并解析存放的
request.body
获取url
request.path
获取url
request.path_info
获取url并且还可以获取到url中?后面携带的参数
request.get_full_path()
FBV:基于函数的视图
url(r’^index/',函数名)
1.在视图层创建函数
def myviews(request):
req_name = request.method
if req_name == "POST":
return render(request, "myviews.html", {"req_name": req_name})
return render(request, "myviews.html", {"req_name": req_name})
2.创建对应的页面
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.css">
head>
<body>
<div class="container">
<p> {{ req_name }}p>
<form action="" method="post">
<input type="submit" class="btn btn-success" value="发送POST请求">
form>
<form action="" method="get">
<input type="submit" class="btn btn-success" value="发送GET请求">
form>
div>
body>
html>
3.设置路由
url(r'^myviews/', views.myviews),
FBV运行过程:
启动django,前端访问myviews通过路由运行视图函数最终返回一个HttpResponse对象
def render(request, template_name, context=None, content_type=None, status=None, using=None):
...
return HttpResponse(content, content_type, status)#返回了一个HttpResponse对象
1.在视图层创建类
from django import views
class myViews(views.View):
def get(self, request):
return render(request, "myviews.html", {"req_name":"现在是GET请求"})
def post(self, request):
return render(request, "myviews.html", {"req_name":"现在是POST请求"})
2.创建对应的页面
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.css">
head>
<body>
<div class="container">
<p> {{ req_name }}p>
<form action="" method="post">
<input type="submit" class="btn btn-success" value="发送POST请求">
form>
<form action="" method="get">
<input type="submit" class="btn btn-success" value="发送GET请求">
form>
div>
body>
html>
3.设置路由
url(r'^myviews/', views.myViews.as_view()),
CBV运行过程:
1.django启动时,路由开始运行,此时的views.myViews.as_view()中的as_view方法先运行返回一个view
# 以下代码为as_view()运行过程的简略代码
@classonlymethod
def as_view(cls, **initkwargs):
... # 别的一些代码
def view(request, *args, **kwargs):
... # 别的一些代码
return self.dispatch(request, *args, **kwargs)
... # 别的一些代码
return view
# 此时as_view最终返回了一个view,实质上也就是dispatch
2.当django收到请求myviews页面时,正式调用view,此时的view开始运行
最终返回一个HttpResponse对象
# 以下代码为view运行过程的简略代码
def view(request, *args, **kwargs):
...
return self.dispatch(request, *args, **kwargs)#返回了一个dispatch
# dispatch运行
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) #返回了一个handler
# 通过观看代码发现handler中最重要的部分为http_method_not_allowed
# 然后http_method_not_allowed运行
def http_method_not_allowed(self, request, *args, **kwargs):
...
return http.HttpResponseNotAllowed(self._allowed_methods())
# 返回了一个http下的HttpResponseNotAllowed
class HttpResponseNotAllowed(HttpResponse):
....
# 运行到最后是一个继承了HttpResponse的类,所以最后整个流程返回依然是一个HttpResponse对象
django提供的模板语法只有两个符号
{{}}:主要用于变量相关操作(引用)
{%%}:主要用于逻辑相关操作(循环、判断)
django向模板传值需要在视图层中进行
django模板语法针对容器类型的取值只有一种方式:句点符
{* 需要的值没有嵌套时 *}
{* 视图函数传来的值 {"name":"kdq", "age":18} *}
{{ name }} {* 直接拿存放数据时的key即可 *}
{* 需要的值嵌套时 *}
{* 视图函数传过来的值 {"data":{"name":[ {"bbc":552, "aac":667, "value": 888} ,{"age":[1,2,3]} , {"hoby":["eat", "sleep", "play"]} ] } } *}
{{ data.name.0.vlaue }}
传值方式1:指名道姓的传 适用于数据量较少的情况,优点在于节省资源
def login(request):
name = "kdq"
age = 18
hoby = ["eat", "sleep", "play"]
return render(request, "login.html", {"name":name, "age":age, "hoby":hoby})
# 对应前端使用时{{ name }} 即可
传值方式2:打包传值 适用于数据量较多的情况,缺点浪费资源
def login(request):
name = "kdq"
age = 18
hoby = ["eat", "sleep", "play"]
return render(request, "login.html", locals())
# 对应前端使用时{{ name }} 即可
基本数据类型都可以
以函数名为值传参:
模板语法会自动加括号执行并将函数的返回值展示到页面上
不支持传参(模板语法会自动忽略有参函数)
以文件名为值传参:
直接显示文件IO对象
以类名为值传参:
自动加括号实例化成对象
以对象名为值传参:
直接显示对象的地址 并且具备调用属性和方法的能力