视图
Django 中的视图的概念是一类具有相同功能和模板的网页的集合。就比如图书管理系统可以建一下几个视图:
- 用户登录----提供用户登录的页面
- 用户注册----提供用户注册的页面
- 所有图书展示----展示所有的图书简介信息
- 图书详细信息展示----展示某一本图书的详细信息
在 Django 中,网页和其他内容都是从视图派生而来。每一个视图表现为一个简单的 Python 函数。Django 将会根据用户请求的 URL 来选择使用哪个视图。
一个 URL 模式定义了某种 URL 的基本格式——举个栗子:定义一个是Python函数login,通过127.0.0.1/login/就可以得到登录的页面。
创建视图
每个视图必须要做的只有两件事:返回一个包含被请求页面内容的HttpResponse对象,或者抛出一个异常,比如Http404。
现在让我们向 app01/views.py 里添加更多视图。
def login(request):
return HttpResponse("这里是登录页面!")
def register(request):
return HttpResponse("这里是注册页面!")
把这些新视图添加进项目文件夹firstdjango中的 urls 模块里,只要添加几个 url() 函数调用就行:
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/',views.login),
url(r'^reg/',views.reg),
]
这样启动Django项目后在浏览器输入 127.0.0.1/login/ 或 127.0.0.1/register/ 就可以看到不同的结果了。
这里需要注意的是当我们输入 127.0.0.1/login 也是可以访问对应的内容的,这是因为路由访问的时候如果不加斜杠,内部会自动重定向到加斜杠的路由。可以在浏览器的开发者模式中看到实际浏览器是请求了两次。
静态文件
除了服务端生成的 HTML 以外,网络应用通常需要一些额外的文件——比如图片,脚本和样式表来帮助渲染网络页面。在 Django 中,我们把这些文件统称为“静态文件”。
静态文件放在对应的 app 下的 static 文件夹中或者项目目录下的 static 文件夹中。对于静态文件需要在项目名下的settings中进行配置。
STATIC_URL = '/static/' # 接口前缀,默认情况下这个前缀跟静态文件夹名字一样
# 静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 静态文件夹路径
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2')
]
STATIC_URL = ‘/static/’ 是暴露给外界能够访问服务器静态文件夹下面所有的资源。这里的static是接口前缀,跟静态文件夹的名字没有关系,前端是通过这个名称来进行访问静态文件,默认情况下这个前缀跟静态文件夹名字一样!
Django 默认会在项目目录下的 static 文件夹中 和 各app下的static文件夹中找文件,会依次查找列表中所有的静态文件路径找到的话立刻停止,都没有找到就直接返回404。
meida文件配置
将media文件内所有的资源全部暴露给用户,用户只需要输入具体的文件路径就可以放到文件内容
settings.py 文件配置
# 访问上传文件的url地址前缀
MEDIA_URL = "/media/"
# 项目中存储上传文件的根目录
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
路由配置
# 配置路由
from django.urls import re_path
from django.views.static import serve
from django.conf import settings
urlpatterns = [
re_path(r'media/(?P<path>.*)', serve, {"document_root": settings.MEDIA_ROOT}),
]
表单
有了登录功能我们需要在前台用 get 或 post 方法提交一些数据,HTML表单是网站交互性的经典方式。
HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。
form提交数据的地址如何指定及方式,action属性控制提交的地址:
- 1.全路径
<form action="http://127.0.0.1:8000/login/">
- 2.只写路径后缀
<form action="/login/">
- 3.不写 (默认往当前路径提交)
form表单默认是get请求,对于安全的请求使用post,通过form的method属性来控制提交方式。
<form action="/login/" method="post">
username: <input type="text" name="username"> <br>
password: <input type="password" name="password"> <br>
<input type="submit" value="提交">
</form>
根据客户端请求方式的不同执行不同的逻辑代码
def login(request):
# 获取用户端提交的请求方式,拿到的请求方式是全大写的字符串
if request.method == 'POST':
return HttpResponse('登录成功!')
return render(request,'login.html')
form表单上传文件是要指定另一个参数:enctype
enctype="multipart/form-data"
获取提交的数据
前端提交过来的所有数据都是保存在 request.POST 或 request.GET 中,request.GET 可以看成一个字典,用GET方法传递的值都会保存到其中,可以用 request.GET.get(‘key’, None)来取值,没有时不报错。
通过 get
和 getlist
获取提交的数据的值,获取value列表里面所有的元素需要使用getlist ,get只会获取到value列表的最后一个元素。
def login(request):
if request.method == 'POST':
print(request.POST) # 你就把它当成一个大字典里面存放了客户端post提交的所有的数据
# request.POST:< QueryDict: {'username': ['linwow'], 'password': ['123']} >
print(request.POST.get('username')) # value虽然是个列表但是获取value的时候拿到却是单个元素,这是因为默认只会取value列表里面的最后一个元素
# request.POST:<QueryDict: {'username': ['lin', 'wow'], 'password': ['123']}>
print(request.POST.getlist('username')) # 要想一次性获取value列表里面所有的数据需要用getlist()
# ['lin', 'wow']
print(request.POST['password']) # 不推荐使用该方法获取数据
return HttpResponse('登录成功!')
return render(request,'login.html')
获取get请求数据的方式跟post请求完全一样!