template模版
编写url和视图文件
#urls.py
path('user/',views.user)
#views.py
def user(request):
return render(request,"user_list.html")
app目录中创建templates目录,templates中放入html文件
浏览器访问user路径返回写好的user_list.html
静态文件
在开发过程中
- 图片
- css
- js
都会当做静态文件处理
static目录
在app目录下创建static文件夹,static文件夹下创建css、js、img
引用静态文件
{% load static %}
<img src="{% static '路径' %}">
<script src="{% static '路径' %}">
Django模版语法
本质上:在HTML中写一些占位符,由数据对这些占位符进行替换和处理
视图函数的render内部
1.读取含有模版语法的HTML文件
2.内部进行渲染(模版语法执行并替换数据) 最终得到,只包含HTML标签的字符串
3.将渲染(替换)完成的字符串返还给用户浏览器
#tpl.html
<body>
<h1>模版语法</h1>
<div>{{ n1 }}</div>
<div>{{ n2 }}</div>
</body>
def tpl(request):
name = "张三"
roles = ["管理员","CEO","保安"]
return render(request,'tpl.html',{"n1":name, "n2":roles})
使用列表的索引
<body>
<h1>模版语法</h1>
<div>{{ n1 }}</div>
<div>{{ n2.0 }}</div>
<div>{{ n2.1 }}</div>
<div>{{ n2.2 }}</div>
</body>
字典
<div>{{ n3 }}</div>
<div>{{ n3.name }}</div>
<div>{{ n3.salary }}</div>
<div>{{ n3.role }}</div>
def tpl(request):
name = "张三"
roles = ["管理员","CEO","保安"]
user_info = {"name":"王二","salary":1000,"role":"CTO"}
return render(request,'tpl.html',{"n1":name, "n2":roles, "n3":user_info})
遍历字典
<ul>
{% for item in n3.keys %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<ul>
{% for item in n3.values %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<ul>
{% for k,v in n3.items %}
<li>{{ k }} = {{ v }}</li>
{% endfor %}
</ul>
列表中套字典
data_list = [
{"name": "王二", "salary": 1000, "role": "CTO"},
{"name": "张三", "salary": 20000, "role": "狗不是"},
{"name": "李四", "salary": 800000, "role": "CEO"},
]
<div>{{ n4.1 }}</div>
<div>{{ n4.1.name }}</div>
<div>{{ n4.1.role }}</div>
{% for item in n4 %}
<div>{{ item.name }} {{ item.salary }}</div>
{% endfor %}
if语句
和for语句差不多
{% if n1 == "张三" %}
<h1>哒哒哒</h1>
{% else %}
<h1>嘟嘟嘟</h1>
{% endif %}
#输出哒哒哒
实例
定义一些新闻,通过网络请求去获取新闻,就拿移动新闻中心获取
抓包获取url
获取json数据,这是字典包含字典包含列表,新闻的标题在list列表中
新创建一个news的html页面并补充url和视图文件函数
通过requests库获取数据
def news(request):
re = requests.get("http://www.10086.cn/aboutus/news/groupnews/5018449_5585_11769.json?nowtime=1644212042955")
data_list = re.json()
new = data_list['cData']['list']
return render(request,'news.html',{"new_list":new})
<body>
<h1>移动新闻中心</h1>
<ul>
{% for item in new_list %}
<li>{{ item.mainTitle }} 时间:{{ item.publishTime }}</li>
{% endfor %}
</ul>
</body>
请求和响应
请求
# 1.获取请求方式 GET/POST
print(request.method)
# 2.在URL上传递值
print(request.GET)
# 3.在请求体中提交数据
print(request.POST)
响应
# 1.[响应]HttpResponse,内容字符串内容返回给请求者
return HttpResponse("返回内容")
# 2.[响应]读取HTML的内容 + 渲染(替换) -> 字符串,返回给用户浏览器
return render(request,'something.html',{"title":"来了"})
# 3.[响应]让浏览器重定向到其他的页面
return redirect("http://www.baidu.com")
get方式请求传递数据 post方式同理
实例
写一个简易的用户登陆
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("user")
password = request.POST.get("pwd")
if username == "root" and password == "123":
return redirect("http://www.baidu.com")
else:
return render(request,'login.html',{"error_msg":"用户名或密码错误"})
这个{% csrf_token %}需要特别注意,不写Django会报错,csrftoken的目的是为了进行校验
<body>
<h1>用户登陆</h1>
<form method="post" action="/login/">
{% csrf_token %}
<input type="text" name="user" placeholder="用户名">
<input type="text" name="pwd" placeholder="密码">
<input type="submit" value="提交"/>
<span>{{ error_msg }}</span>
</form>
</body>
用户名密码正确跳转百度,这是最简易的用户登陆与真正的项目还相差很远,因为将逻辑写死了。这个主要为了跟好的了解Django中的请求与响应。
人生漫漫其修远兮,网安无止境。
一同前行,加油!