Django 之 视图、表单、静态文件

视图

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("这里是注册页面!")

把这些新视图添加进项目文件夹fristdjango中的 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。

表单

有了登录功能我们需要在前台用 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,通过from的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')

获取提交的数据

前端提交过来的所有数据都是保存在 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请求完全一样!

猜你喜欢

转载自blog.csdn.net/linwow/article/details/91049387