一、运行Django
1、保证app已注册
前面已经创建了app了,每个app都要注册
app1的apps.py中有个类,然后在项目里面的settings.py里面找到下方的代码,添加到最下面一行
'app1.apps.App1Config'就可以了,app1代表创建的app名称
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1.apps.App1Config',
]
2、编写url和视图函数之间的对应关系
编写一个简单的视图函数,找到urls.py,找到urlpatterns,加一个path,第一行给他注释掉
项目的路由统一都写在这里
urlpatterns = [
# path('admin/', admin.site.urls),
path('index/', views.index),
]
index/代表路径,访问这个路径就会调用后面的views.py里面的index函数,现在views.py里面是没有这个函数的,下一步去views.py里面创建index函数
由于返回了一个HttpResponse方法,所以要导入一个HttpResponse模块,这里定义了视图函数index,urls.py文件要调用该函数就要引用view文件
启动项目后,用户访问index/路径后就会返回一个字符串“你好,Django!”
3、启动Django项目
通过命令行启动
python manage.py runserver
也可以带ip地址和端口启动项目:python manage.py runserver 0.0.0.0:9000
如果有如下报错
执行命令:python manage.py migrate
10013错误代码是表示端口冲突,换个9000或其他端口启动然后就可以了
正常后登录是这样
会提醒你写了这个url(index/),如果写了其他url也会在这里列出来,后面加上你写的url就可以访问了
4、解析路由参数
上面写的路由规则是固定的,下面介绍动态路由
1)编写带url参数的路由
运行结果
2)介绍路由参数
url的参数类型
类型 | 说明 |
str | 任意非空字符串,不包含“/”,默认类型 |
int | 匹配0和正整数 |
slug | 匹配任何ASCII字符、连接符和下划线 |
uuid | 匹配一个uuid格式的字符串,该对象必须包含“-”,所有字母必须小写。如00000000-abcs-3cii-1234-000000123412 |
5、视图函数的底层原理
Django中的视图是MTV模式中的View层,用户处理客户端的请求并生成响应数据,在视图中使用函数处理请求的方式,被称为视图函数,当浏览器请求一个页面是,Django先创建HttpRequest对象,该对象中包含请求的元数据,然后加载响应视图,将这个HttpRequest对象作为第一个参数传递给视图函数,视图函数会返回一个HttpResponse对象。
HttpRequest对象主要包含如下
属性/方法 | 含义 |
path | 字符串,标识请求页面的路径,不包含域名 |
method | 字符串,标识页面的请求方法,常用值包含“GET”和“POST”,必须大写 |
encoding | 字符串,标识提交的数据的编码方式,一般默认UTF-8 |
GET | 字典类型,包含GET请求方法中的所有参数 |
POST | 字典类型,包含POST请求方法中的所有参数 |
FILES | 字典类型,包含上传文件的信息 |
COOKIES | 字典类型,包含所有的cookies对象 |
META | 字典类型,包含所有的HPPT头部信息 |
session | 字典类型,当前会话 |
user | 当前登录的用户 |
views.py文件中
def test(request):
print(request.get_host()) # 域名+端口
print(request.get_raw_uri()) # 全部路径
print(request.path) # 文件路径,不含参数
print(request.get_full_path()) # 文件路径,包含参数
print(request.method) # 获取请求的HTTP方式
print(request.GET) # 获取GET请求的参数
print(request.META["REMOTE_ADDR"]) # 客户端ip地址
print(request.GET.get('username')) # 获取get参数
return HttpResponse("")
urls.py文件中
控制台输出如下所示
HttpResponse对象的常见属性
属性 | 含义 |
content | 返回的内容 |
status_code | 返回的HTTP状态码 |
content-type | 返回数据的MIME类型,默认为text/html |
常用的状态码
状态码 | 含义 |
200 | 成功 |
301 | 永久重定向 |
302 | 临时重定向 |
404 | url不存在 |
500 | 内部服务器错误 |
502 | 网关错误 |
503 | 服务不可用 |
修改一下test函数内容
def test(request):
response = HttpResponse()
response.write("Hello django")
response.write("<br>") # 换行
response.write(response.content) # 返回的内容
response.write("<br>")
response.write(response['Content-type']) # 返回的数据MIME类型
response.write("<br>")
response.write(response.status_code) # 返回的状态码
return response
二、模板和静态文件
Django提供了模板技术用于编写html代码,之后可以通过视图技术渲染模板将最终生成的html代码返回给客户端浏览器显示,Django模板技术作为MTV模式中的T(template),主要用于页面的展现,实现了业务逻辑和内容显示的分离,通常一个模板可以供多个视图使用
静态部分,如html、css、JavaScript
动态部分,如Django的模板语言DTL
通过HttpRequest对象和HttpResponse对象可以处理基本的数据请求和并返回响应数据,但是这种方式很烦琐,Django将这些底层的操作过程全部进行了封装,提供了几个简单的函数供我们使用。
render()函数实现页面渲染,格式为
from django.shortcuts import render
# request:传递给视图函数的所有请求,就是视图函数的参数request
# template:渲染的模板文件,一般放在templates目录下
# content:数据格式为字典类型,保存要传递到HTML文件中的变量
# content_type:默认text/html
# status:响应的状态代码,默认200
# using:设置模板引擎,用于解析模板文件
render(requeset, template_name, content=None, content_type=None,
status=None, using=None)
redirect()函数实现页面重定向
1、templates目录
1)通过urls文件里的路由配置调用视图函数,视图函数调用html文件
这个目录没有的话可以创建一个,放在应用(app)的根目录下面,用来存放html文件
新建一个html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post" action="/login/">
<input type="text" name="user" placeholder="用户名">
<br>
<input type="password" name="pwd" placeholder="密码">
<span style="color:red">{{ error_msg }}</span>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
和之前一样,分别加上url和视图函数
使用了render()函数渲染页面,然后浏览器访问页面
2)通过在html文件中设置占位符获取变量
a)模板变量的表示:模板变量使用{{ 变量名 }}来表示,注意变量名前后都有个空格,变量名由字母、数字和下划线组成,中间不能有空格等其他字符
b)模板变量还可以是列表、字典及类对象
c)模板标签,模板标签需要使用标签限定符{% %}进行包裹,常见的标签有
模板标签 | 描述 |
{% if %} {% endif %} | 条件判断模板标签 |
{% for %} {% endfor %} | 循环模板标签 |
{% url %} | 路由配置的地址标签 |
{% extends xx %} | 模板继承标签,从xx模板继承 |
{% load %} | 加载相关内容,如{% load static %} |
{% static %} | 静态资源 |
{% block %} {% endblock %} | 一组占位符标签,需要重写模板 |
{% csrf_token %} | 用来防护跨站请求伪造攻击 |
{% include 页面 %} | 包含一个html页面 |
d)模板过滤器
过滤器 | 描述 |
{{ name|safe }} | 关闭html标签和JavaScript脚本的语法标签的自动转义功能。 |
{{ name|length }} | 获取模板变量的长度 |
{{ name|default:"默认值" }} | 当变量的值为False时,显示默认值 |
{{ name|date:"Y-m-d G:i:s" }} | 格式化输出时间日期变量 |
{{ name|upper }} | 将字符转为大写 |
{{ name|lower }} | 将字符转为小写 |
{{ name|slice:"2:4" }} | 以切片方式获取字符串的一部分 |
新建一个文件students.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板语法学习</title>
</head>
<body>
<h1>传递变量</h1>
<div>{{ s1 }}</div><!-- 传递视图函数中s1的值 -->
<div>{{ s2 }}</div><!-- 传递视图函数中s2的值 -->
<br>
<div>{{ s2.0 }}</div><!-- 传递视图函数中s2列表中的第一个值,通过“.”后面加索引访问 -->
<div>{{ s2.1 }}</div><!-- 传递视图函数中s2列表中的第二个值,通过“.”后面加索引访问 -->
<br>
<div>
{% for i in s2 %}<!-- 循环获取s2列表中的每个值 -->
<div>{{ i }}</div>
{% endfor %}<!-- 循环必须有结束 -->
</div>
<br>
<div>
<div>{{ s3 }}</div><!-- 直接获取字典 -->
<div>{{ s3.name }}</div><!-- 根据字典的键获取对应的值 -->
<div>{{ s3.score }}</div>
<div>{{ s3.sex }}</div>
</div>
<ul>
{% for i in s3.keys %}<!-- 循环获取s3中的键 -->
<li>{{ i }}</li>
{% endfor %}
</ul>
<hr/>
<ul>
{% for i in s3.values %}<!-- 循环获取s3中的值 -->
<li>{{ i }}</li>
{% endfor %}
</ul>
<hr/>
<ul>
{% for i,j in s3.items %}<!-- 循环获取s3中的键值 -->
<li>{{ i }} = {{ j }}</li>
{% endfor %}
</ul>
<hr/>
</body>
</html>
views.py文件
def students(request):
name = "张三"
role = ["班长", "学习委员", "体育委员"]
report_card = {"name": "张三", "score": "80", "sex": "男"}
return render(request, "students.html", {"s1": name, "s2": role, "s3": report_card})
配置路由后访问
访问列表或者字典里面的值都是通过“.”加索引或者键名去访问的,如果是列表里面还有字典,继续“.”加索引或者键名去钻取访问
2、static目录
一般img、css、js这些静态文件都会存放在该目录下,如果没有就自己创建一个,和templates一样
新建一个html文件
{% load static %}
<!-- Django模板语法,引用静态文件的时候都需要加上上面这行代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>引用图片</title>
</head>
<body>
<h1>引用图片</h1>
<img src="{% static 'img/02.png' %}" alt="">
</body>
</html>
url和视图函数配置好