静态文件引用
django项目开发过程中,通过django.contrib.staticfiles提供静态文件服务,所以确保它在INSTALLED_APPS配置中。
路径设置
静态文件的设置有两个:
1、静态文件目录
在项目根目录下创建static文件夹,然后配置STATICFILES_DIRS
# setting.py
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
2、静态配置静态文件
<link rel="stylesheet" href="/static/crm/css/base.css">
缺点,如果有很多静态文件,且后期修改了static的名称或路径,需要全部修改
3、动态配置静态文件
{% load static %}
<link rel="stylesheet" herf="{% static 'crm/css/base.css' %}">
请求和响应
web框架本质就是处理用户发起的请求,然后返回响应结果,请求和响应就是框架中的数据流。
请求
当页面被请求时,djgango会创建一个HttpRequest对象,该对象包含于请求的元数据。然后django加载适当的视图,将HttpRequest对象作为第一个参数传递给视图函数。每个视图负责返回一个HttpResponse对象。
HttpRequest 对象
常用属性
-
.body
原始请求的body,类型是字节类型 -
.method
代表请求中使用的http方法字符串,保证是大写字母,例如在函数视图中通过判断request.method来处理不同的逻辑:
if request.method == 'GET';
do_something()
elif request.method == 'POST';
do_something()
- .GET
一个类似字典的对象,包含所有给定的HTTP GET参数(查询参数)
-
.POST
一个类似字典的对象,包含所有给定表单格式的HTTP POST参数 -
Files
一个类似字典的对象,包含所有上传的文件
响应
与django自动创建请求对象不同,创建响应对象是开发的责任。你写的每个视图都要负责实例化,填充和返回一个响应对象。
HttpResponse
传入字符串
典型的用法是将页面的内容以字符串或字节字符串的形式传递给HttpResponse构造函数:
from django.http improt HttpResponse
response = HttpResponse("Here's the text of the web page.")
response = HttpResponse("Text only,please", content_type="text/plain")
response = HttpResponse(b"Bytestrings are also accepted")
也可以增量的形式添加内容,你可以使用response作为这个类似文件的对象
response = HttpResponse()
response.write("<p>Here's the text of the web page.</p>")
response.write("<p>Here's another paragraph.</p>")
设置头字段
使用HttpResponse.headers设置和删除一个字典
response = HttpResponse()
response.header['Age'] = 120
del response.headers['Age']
设置状态码
直接传递参数status给构造函数
from django.http improt HttpResponse
response = HttpResponse("Here's the text of the web page.", status=200)
JsonResponse对象
一个HttpResonse的子类,用来创建json编码的响应。默认的Content-Type为application/json。第一个参数data应该是字典实例。如果safe参数设置为False它可以是任何json可序列化的对象。
典型的用法
from django.http import JsonResponse
response = JsonResponse({'foo': 'bar'})
response.content
>>>b'{"foo":"bar"}'
视图
在django中,视图是一个可调用的对象,能够接收客户的请求并返回响应。在视图中通过模型操作数据库,通过模板构造返回数据。
约定将视图放在名为views.py的文件里,这个文件放置在项目或应用目录里。
django中视图有两种
- 函数视图
- 类视图
函数视图
最简单的视图,就是一个普通的python函数,它接收web请求并发回一个web响应。例如:
from django.http import HttpResponse
def index(request):
return HttpResponse("这是首页面")
特点:
- 逻辑清晰好理解
- 复用性较差
类视图
类视图是以类的形式组织视图,类视图并不能代替基于函数的视图,与函数视图相比,类视图有如下优势:
- 与特定的HTTP方法关联,能通过单独的方法替代条件分支的处理不同的HTTP请求
- 面向对象技术,可用于将代码分解为可重用的组件
返回登录页面
在crm/views.py文件中创建一个视图函数,需要配置路由
def login(request):
"""区分不同请求get post"""
if request.method == 'GET':
return render(request, 'crm/login.html')
elif request.method == 'POST':
"""登录的逻辑"""
# 获取参数
username = request.POST.get('username')
password = request.POST.get('password')
# 校验
if username == 'xinlan' and password == '123456':
return redirect('/crm/index/')
else:
return HttpResponse("用户名密码错误")
创建一个登录的login.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h2>deng</h2>
<form action="" method="post">
<p>用户名:<input type="text" name="'username"></p>
<p>密码:<input type="password" name="'password"></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>
注:当action为空时,数据请求会推送到当前路径,如上图,会将数据推送到http://127.0.0.1:8000/crm/login/。如果action=“/login”,则会推送到http://127.0.0.1:8000/login, 如果action=“login”,http://127.0.0.1:8000/crm/login/login/
CSRF报错
解决方法,关闭settings中中间键的crsf