django学习笔记
# todo 1.django项目创建与视图
Django过程
1.新建项目 new project
django
2.新建APP terminal
django-admin startapp user
3.项目settings
INSTALLED_APPS = 添加'user.apps.UserConfig',
4.user目录(APP)
新建urls.py
写入
from django.urls import path,re_path
from . import views
urlpatterns =[
path('',views.index_handler,name='index')
]
#映射名可改为name='user_index'
#或在主url #或path('goods/',include('goods.urls','user'),namespace='user'),
#这两种改法一样,前一种更好用
5.user/views.py
写入
from django.shortcuts import render,HttpResponse
# Create your views here.
def index_handler(request):
return HttpResponse('user index')
6.项目urls
修改
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('user/',include('user.urls')),
#或path('user/',include(('user.urls','user'),namespace='user')),
]
7.运行manage.py IDE右上edit parameters输入runserver 80
二
1.正则路由映射参数的传递与接收
user/urls.py
添加
urlpatterns =[
path('',views.index_handler,name='index'),
#path 普通路由映射
re_path('(\d+)',views.re_handler,name='re'),
#(匹配数字长度》=1,定义一个处理器,名字为're') re_path接收正则表达式
]
选中views.re_handler用alt+enter点击创建处理器名快速创建
def re_handler(request,num):
return HttpResponse(num)
#创建num并返回
打开浏览器登录http://127.0.0.1:80/后面输123返回123
2.基础正则表达式
.除\n \r所有字符 \d数字大写D非数 \w数字字母下划线 \s空格
*出现次数》=0 +出现次数》=1 {n}出现次数等于n {n,m}次数大于等n小于等m
$以结尾 ^以开头
.*常用于表示除换行符外所有字符
[0-9]列举与\d效果一致
3.用户主页案例
打开浏览器登录http://127.0.0.1:80/后面输name1返回 你好:name1
项目urls
修改
re_path('^(\w+.*\d+)$',views.user_handler),
#(匹配任意字符开头中间任意结尾为数字,定义一个处理器user_handler) re_path接收正则表达式
user/views
添加
def user_handler(request,username):#对应处理器user_handler
return HttpResponse('你好:%s'%username)
三
反向解析处理器 处理器反向解析得到对应的url地址
1.user/views添加
from django.shortcuts import render,HttpResponse,reverse
2.并在下面创建
def reverse_handler(request):
print(reverse('user:index'))
#reverse(总urls的namespace:app中对应的name值)
print(reverse('user:re',args=('1234',)))
#reverse(总namespace:app中Re,对应返回值num
return HttpResponse('reverse')
#return防止报错返回一个reverse
3.用于打印下面两个处理器对应的url地址
def index_handler(request):
return HttpResponse('user index')
def re_handler(request,num):
return HttpResponse(num)
4.在user/urls.py中添加刚才的reverse路由映射
path('reverse',views.reverse_handler),
5.启动服务
打开主页http://127.0.0.1:80/user/reverse
看到控制台记录返回了对应的url地址
/user/
/user/1234
四
路由与模板request与response对象
客户端请求request 服务器响应response
Django把request对象封装成类对象httprequest
request.对象
method关键字 返回请求方式get/post
get会把请求放在url中 post会把请求放在headers里并加密保存
path关键字 返回页面路径不包括域名xxx.xxx.xxx为服务器域名后面的是页面路径
META关键字 封装请求头的数据 查看请求头封装那些参数可直接打印META
REMOTE_ADDR返回客户端ip地址
CONTENT_TYPE请求正文mime格式三种 1.-text/html HTML 2.-text/plain普通文本 3.-application/json json python中称字典前端称json
json与字典的不同 key对应空值none/null 真假TF大写/tf小写
GET与POST关键字 数据保存在QueryDict对象里 分别通过.get和.getlist方式获取
FILES关键字 封装上传文件数据 客户端>服务器
COOKIES关键字 封装请求的cookies类字典对象 分别保存于客户端与服务端
session关键字 用于保存一些敏感的信息放置于服务器根据cookies上传值获取
1.request.对象
user/views找到添加
def index_handler(request):
print(request.method)#打印请求方法
print(request.path)#打印请求路径
print(request.META['REMOTE_ADDR'])#打印访问者的ip地址
print(request.META['CONTENT_TYPE'])#打印请求的mime类型
return HttpResponse('user index')
启动服务 访问首页/user 看到控制台记录
GET
/user/
127.0.0.1
text/plain
打印请求头数据request.META user/views找到添加 完成刷新网页
def index_handler(request):
print(request.META)
return HttpResponse('user index')
看到控制台返回 一个字典就是META所有请求头中的数据
{'#ENVTSLOGSSS5272': '316779440', '#ENVTS......'}
遍历字典数据
for key in request.META.keys():
print('%s=%s'%(key,request.META[key]))
2.response对象
HttpResponse对象
user/views chrome浏览器F12打开浏览器控制台
return HttpResponse('文本类数据',
content='响应体',
content_type='MIME类型',#见上
status='状态码',#服务器告知客户端请求是否成功
#403服务器拒绝请求 400请求语法错误 404没找到对应页面
)
修改后打开chrome浏览器F12打开浏览器控制台
def index_handler(request):
return HttpResponse(
content='HttpResponse',#响应文字
content_type='text/plain',#响应类型
status=500,#响应状态码,打开浏览器即使正常也会返回此码
)
3.JsonResponse对象 会把字典对象转为json对象
jsonresponse是对httpresponse的一种封装
如果在jsonrespons传递对象中出现中文需在下面添加
json_dumps_params={'ensure_ascii':False}#保证中文的正确显示
user/views
添加 完后打开浏览器
from django.http import JsonResponse
def index_handler(request):
return JsonResponse(
{
'edu':'优快云学院',
'course':'Python',
},
json_dumps_params={'ensure_ascii': False}
# 保证中文的正确显示
)
4.重定向 在视图函数返回另一个对应的视图函数地址类似不用输入/user直接访问
user/views添加
from django.shortcuts import render,HttpResponse,reverse,redirect
在最下面定义
def redirect_handler(request):
return redirect(reverse('user:index'))
通过reverse函数得到'user:index'的路由映射
再到user/urls加入重定向映射 刷新网页 网址添加/user/redirect发现直接跳转到/user
urlpatterns =[
path('',views.index_handler,name='index'),
re_path('(\d+)',views.re_handler,name='re'),
re_path('^(\w+.*\d+)$',views.user_handler),
path('reverse',views.reverse_handler),
path('redirect',views.redirect_handler)
# ^ 加入重定向handler的path
]
其他
项目文件夹
manage 通过本文件启动项目
templats 文件夹模板
settings 项目配置文件
user(APP) 子项
wsgi 部署服务器配置
项目urls含user/urls 网址user/urls对应views视图 views返回结果
网址对应视图的关系为路由映射
ctrl+shift+f10可快速启动环境了
联想输入设置
file> settings> live >livetemplats> python> 加号> abbre输入快捷键> 下面输入联想内容
#todo 2.模板的调用与传参
os.path.join(BASE_DIR,'templates')当前目录templates文件夹
1.模板原理
之前 客户端-路由-视图-客户端 HTTPresponse
现在 客户端-路由-视图-模板-客户端 HTML
2.模板调用
2.1templates文件夹中创建html 例index.html
视图中 runder传递方法 目标
需要传递的参数
def index_handler(request):
return render(request,'index.html')
3.模板传参
定义context字典 作为第三个参数传给render 在index.html中能够得到context传入的参数
在上面的def下面添加
#需要传递的参数
def index_handler(request):
context={
'username':'name1',
'password':'pass1'
}#以上为index.html的上文
return render(request,'index.html',context)
在网页index.html中能够通过{{username}}取到刚才定义的name1
错误[Django]TemplateDoesNotExist
解决settings修改此处
TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR,'templates')],}]
模板层基础语法
1.参数输出
变量名不能以下划线开头
context={
'key1':'value1',
'key2':['value1','value2'],
'key3':{
'key3_1':'value3_1',
'key3_2':'value3_2',
}
}
参数输出 普通 列表 字典 {#...#}是模板语法中的注释
{{key1}}
{{key2.0}}{{key2.1}}
{{key3.key3_1}}{{key3.key3_2}}
2.循环语句
需要传递的参数
def index_handler(request):
context = {
'hobbys': ['Python', 'Java', 'C']
} # 以上为index.html的上文
return render(request, 'index.html', context)
for in 遍历输出hobby 注意{{hobby}}
{%for hobby in hobbys%}
爱好:{{hobby}}<br/
{%endfor%}
3.判断语句
网页写法
{%if 条件%} {%elif 条件%} {%else%} {%endif%}
4.得到视图函数的地址
用url返回页面地址/t3
def t4_handler(request):#t3地址
return render(request, 't4.html')
t3_handler的地址是:{ % url 'goods:t3' %}
参数传递与返回
def re_handler(request,num):
return HttpResponse(num)
{%url 'namespace:name' num%}#num在这里设定 同时显示返回
4.1以app goods为例 建好html文件 t1 t2 t3 t4
4.2配置主urls里的app path地址参数为''
path('', include(('goods.urls', 'goods'), namespace='goods')),
4.3配置goods/urls定义路由映射t1 t2 t3 t4
urlpatterns=[
path('t1', views.t1_handler, name='t1'),
path('t2', views.t2_handler, name='t2'),
path('t3', views.t3_handler, name='t3'),
path('t4', views.t4_handler, name='t4'),
re_path('(\d+)', views.re_handler, name='re'),#正则
]
re_path 是正则映射参数
打开goods/views 右键上面标签split分屏
def t1_handler(request):#提取普通 列表 字典参数
context = {
'key1': 'value1',
'key2': ['value1', 'value2'],
'key3': {
'key3_1': 'value3_1',
'key3_2': 'value3_2',
}
}
return render(request, 't1.html', context)
def t2_handler(request):#遍历传参显示
context = {
'hobbys': ['python', 'java', 'c']
}
return render(request, 't2.html', context)
def t3_handler(request):#变色传参显示
context = {
'message': '这是一个根据style变色的信息',
'style': 1,
}
return render(request, 't3.html', context)
def t4_handler(request):#t3地址
return render(request, 't4.html')
t3_handler的地址是:{ % url 'goods:t3' %}
def re_handler(request,num):#返回设定参数
return HttpResponse(num)
re_handler的地址是:{%url 'goods:re' 1 %}
模板过滤器
过滤器语法
过滤器
模板中对传递过来的数据进行修饰 ,再进行显示
语法
{{变量|过滤器关键字:参数}}
如果没有参数传递可以不写
1.常用过滤器使用
safe 禁止HTML转义 length得到长度或元素个数 date 日期(y-m-d h:i:s)
default:默认值 upper 转大写 lower转小写
2.多个过滤器配合:{{变量|过滤器1|过滤器2}}
原样输出:
ul
li html_code:{{ html_code }} /li
li datetime:{{ datetime }} /li
/ul
过滤器:(格式:变量|过滤器:参数)style变量不存在以默认值填充
ul
li safe禁止转义:{{ html_code|safe }} /li
li length:{{ html_code|length }} /li
li date输出日期:{{ datetime|date:'Y-m-d H:i:s' }} /li
li default默认值:{{ style|default:'默认值' }} /li
li upper转大写:{{ html_code|upper }} /li
li lower转小写:{{ html_code|lower }} /li
li 多个过滤器:{{ html_code|lower|safe }} /li
/ul
模板复用与block提取
子类继承父类调用和复写
1.模板继承{%extends'xxx.html'%}继承目标html的所有信息
2.block选定标签 end在选定标签末尾 定义与重写中间的内容 在父模板中定义
{%block 代码模块名称 %}
中间内容
{%endblock%}
调用父模板中的代码:{{block.super}}
静态文件访问建立 不是下载
1.建立static文件把静态文件导入
项目settings
找到STATIC_URL='/static/'
在下面添加
STATICFILEDIRS=[os.path.join(BASE_DIR,文件夹名)]
2.在app视图函数中添加引用路径
def index_handler(request):
file_s=os.listdir(#文件列表显示
os.path.join('static','file')#前路径,后文件夹名
)
return render(request,'index.html',context={'file_s':file_s})
#传入路径参数
3.建立index.html
body
<ul>里面建立无序列表 循环
{%for file in file_s%}
<li> #路径括号里链接 接括号里文件名
<a href='/static/file/{{file}}'>{{file}}</a>
</li>
{%endfor%}
</ul>
#todo 3.cookie的安全性和生命周期
1.cookie的原理
由服务器生成 存储在浏览器中的 键值对数据
每个域名的cookie相互独立
访问域名为A的url地址 会把a域名下的cookie一起传递到服务器
cookie可以设置过期时间
2.cookie的设置与获取
设置格式response
response=HttoResponse()
response.set_cookie(key,value,max_age=60*60)
#过期时间默认值为none关闭浏览器即删除 此设过期时间60*60秒
return response
获取request
value=request.COOKIES.get(key,None)#后key是键
案例
cookie的发送和接受
app/urls
urlpatterns添加
re_path('set_cookie/(.+)/(.+)', views.set_cookie_handler, name='set_cookie'),
# 发送 设置cookie 正则表达式 第一加号是键 第二加号是值
re_path('get_cookie/(.+)', views.get_cookie_handler, name='get_cookie'),
# 接收 读取根据键读取
发送 在app/views里添加 先set后get
def set_cookie_handler(request,key,value):#键值
response=HttpResponse()
response.set_cookie(key,value,max_age=60*60)
return response
接收
def get_cookie_handler(request,key):#接收cookie
value =request.COOKIES.get(key)#提取value
return HttpResponse(value)#在浏览器中输出value值
运行项目打开浏览器
http://127.0.0.1:8000/set_cookie/username/user1
http://127.0.0.1:8000/get_cookie/username
#得到返回值user1
3.cookie的安全性
cookie是存储在客户端 即浏览器 具有不安全性
对于敏感信息 应该加密 或保存在服务端 session
session的原理和使用
1.session原理
基于cookie
把敏感信息以加密方式保存在服务器 用户名 密码
服务器创建sessionid 并把客户端的sessionid 与数据库的sessionid对应起来 能设置过期时间
2.session的设置
类似字典 实质class类
#设置
request.session[key]=value
#设置过期时间
request.session.set_expiry(60*60)
#获取 不设置过期时间 django默认2周
value=request.session.get(key)
#如果没有key返回None
案例
app/urls
urlpatterns添加
re_path('set_session/(.+)/(.+)',views.set_session_handler,name='set_session'),
#设置session 正则表达式 第一加号是键 第二加号是值
re_path('get_session/(.+)',views.get_session_handler,name='get_session'),
# 接收 读取根据键读取
项目settings设置 DATABASE 找到对应数据库 打开数据库 看到表结构 django_session
在app/views里添加
def set_session_handler(request,key,value):#生成
request.session[key]=value
#request.session.set_expiry(60*60)
return HttpResponse('设置成功')
def get_session_handler(request,key):#获取
value=request.session.get(key)
return HttpResponse(value)
3.session的获取
4.flush()和clear()命令
案例
app/urls
urlpatterns添加
path('flush',views.flush_session_handler,name='flush'),
#删除 数据库对应表数据
path('clear',views.clear_session_handler,name='clear'),
#清空sessionid对应的数据
在app/views里添加
def flush_session_handler(request):#删除数据库对应表数据
request.session.flush()
return HttpResponse('flush')
def clear_session_handler(request):#清空sessionid对应的数据 清除后返回结果是NONE
request.session.clear()
return HttpResponse('clear')