【Django 简介】
post 与 get 取值
post
与 get
GET提交的数据会放在URL之后,
以?分割URL和传输数据
,参数之间以&相连
,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.GET提交的数据
大小有限制
(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.GET与POST请求在服务端获取
请求数据方式不同
。GET方式提交数据,会带来
安全问题
,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
响应协议
服务器对客户端发送数据
# 读取html文件 因为网络传输编码要转换
with open('index.html', 'rb') as f:
data = f.read()
# 例:协议版版本:HTTP/1.1 状态码:200 状态码原因短语:OK 分隔符:\r\n\r\n
# 响应头里得内容以\r\n分割
# 包头 与 包内容 以\r\n\r\n 分割
conn.send(b"HTTP/1.1 200 OK\r\n\r\n%s" % data)
post与get取值
登录页面案例
def login(request):
# 测试之前请把 setting内MIDDLEWARE的第四行内容注释掉
# 如果POST则是表单登录
if request.method == 'GET': # request.method 获取请求模式
# 如果是get请求说明是访问页面
return render(request, 'login.html')
else:
print(request.POST) # 取到一个字典
# 打印结果
user = request.POST.get('user')
pwd = request.POST.get('pwd')
return HttpResponse(user+'-'+pwd)
Django最简版案例
MVC模式
- M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
- T 代表模板 (Template):负责如何把页面展示给用户(html)。
- V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
最简单案例
url控制器
from app import views # 导入视图模块
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index), # 新增页面加到下一行 ,内置!会传一个型参一般取名request
]
视图
def index(request):
import datetime # 测试功能打印时间
now=datetime.datetime.now()
ctime=now.strftime("%Y-%m-%d %X")
# 需要用内置render方法与页面模版关联:
return render(request,"index.html",{"ctime":ctime}) # 花括号注入参数,字典形式
模板
<body>
<h4>当前时间:{{ ctime }}</h4> # 两个花括号,用key取值
</body>
屏蔽-提交POST的错误提示
setting 内 MIDDLEWARE 的第四行内容注释掉!!!
【常用模块】
视图views常用
模块名 | 作用 | 模块导入 |
---|---|---|
HttpResponse |
视图内写HTML直接打印 | from django.shortcuts import HttpResponse |
reverse |
视图内反向解析地址 | from django.urls import reverse |
urls 访问连接常用
模块名 | 作用 | 模块导入 |
---|---|---|
re_path |
正则匹配访问地址 | from django.urls import re_path |
include |
url**分发 **给对应文件内的urls处理 |
from django.urls import include |
register_converter |
自定义 路径正则匹配注册 功能 |
from django.urls import register_converter |
【路由访问url控制】
内部文件路径static设置
通常static目录用来存放项目对应文件,如Jquery.js
这样就可以再html中调用路径‘/static/jquery-3.3.1.min.js’来取得jq
方法
# 再setting.py文件底部设置
# 配置路径的方法
STATIC_URL = '/static/' # 真正使用的别名 下面设置的名字无所谓
STATICFILES_DIRS = [
# 上面一行的STATIC_URL = '/static/' 路径代替jion的地址
os.path.join(BASE_DIR, 'static') # 把新增加的添加到内置的STATICFILES_DIRS内
# 这样就可以同src="/static/jquery.js"来引用了
]
访问url、匹配对应页面
分发给对应项目
from django.urls import include
# 公共部分(部分发)
path('admin/', admin.site.urls),
# 分发---把每个app单独的访问url分发给对应文件夹内的urls处理
# 分发给对应app01目录下的urls.py处理
re_path(r'app01/',include('app01.urls')),
根目录访问 index页面
re_path(r'^$',views.index)
正则分组[ 有名 - 无名] 分组
路由配置: 路径------------>视图函数 (哪个路径,交给哪个函数处理)
from django.urls import re_path # 正则匹配路径
# ^以固定头开始,$固定尾结尾的
re_path(r'^articles/2003/$',views.special_case_2003),
# 带一个参数
# 注意!以分组形式的正则会把,分组得到的值以参数形式,传给视图(再request之后)
re_path(r'^articles/([0-9]{4})/$',views.year_archive),
# 带两个个参数,自定义名传参 格式 ?P<参数名>
# !视图收参,必须是<>设置的名字
re_path(r'articles/(?P<y>[0-9]{4})/(?P<m>[0-9]{2})$',views.month_archive)
视图接收参数
def archive(request,year): # request每个必传的形参,后面参数以分组
return
反解析 - 动态获取路径
为了拓展性 例:在urls中,其一页面修改路径,为了不在html代码中繁琐更新,那HTML页面要动态获取新路径
urls中:
# 需要在urls中,添加:name='自定义名'
path('login/',views.login,name='log')
html中:
{# {% url 'log' %} 等同于获取,自定义别名为log的路径,并返回 #}
<form action="{% url 'log' %}" method="post">
在视图views中反解析
views中:
from django.urls import reverse # 反向解析函数必须导入
# html中不带正则
rul=reverse('urls中自定义的别名') # 可以解析出rul
# html中有正则的,必须后面带参数且位数与正则相同的充数,否则报错
rul = reverse('urls中自定义的别名',args=('符合正则位数参数1',)) #r'^articles/2003/$'
名称空间 - 解决多APP内别名相同
# 取别名--名称空间include内以元祖形式,跟第二个参数别名
re_path(r'app01/',include(('app01.urls','名称空间别名'))) # include分发对应app
# 那么在views 内反解析时,固定语法reverse("名称空间:名称空间别名")
reverse("名称空间:名称空间别名")
# 中间:号 来获取对应app内的对应别名,防止重名导致的bug
path - 封装正则 自动转换类型
django2.0版的path中
规则
- 使用尖括号<>从url中捕获
- 语法:<内置匹配器:自定义名> 自定义名传给视图内,request后
封装了5种匹配方法
语法 | 匹配规则 |
---|---|
str |
默认:匹配除了路径分隔符(/)之外的非空字符串 |
int |
匹配正整数,包含0 |
slug |
匹配字母、数字以及横杠、下划线组成的字符串 |
uuid |
匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00 |
path |
匹配任何非空字符串,包含了路径分隔符 问号不包含 |
例子
from django.urls import path
from . import views # 导入视图路径
urlpatterns = [
path('articles/2003/', views.special_case_2003),
# 匹配int类型,views内接request后 接收一个int类型
path('articles/<int:year>/', views.对应函数1),
# 匹配int类型,views内接request后 接收两个int类型
path('articles/<int:year>/<int:month>/', views.对应函数2),
# 匹配int类型,views内接request后 接收两个int类型 和 一个匹配字符-数字等的字符串
path('articles/<int:year>/<int:month>/<slug>/', views.对应函数3),
]
若不够用,就自定义!!!
建议单独建一个 urlconvert.py (url转换器) 单独建一个py文件存放自定义的
步奏
- 先建一个py文件内写入规则
- 在urls中注册第一步的路径方法
- 正常引用
单独的py文件内:
class MonConvert: # 自定义名
regex = '[0-9]{2}' # 正则规则
# 【下面两个必须这样写!!!!!】
def to_python(self, value):
return int(value)
def to_url(self, value): # 反向解析
return '%04d' % value
urls中引用注册自定义模版
# 要引入注册自定义匹配膜拜模块
from django.urls import register_converter
import MonConvert
register_converter(MonConvert, 'mm') # mm知识取的名字,无所谓,后面引用这个名字匹配正则即可
urlpatterns = [
path('articles/<mm:year>/', views.路径),
...
]
【视图】
request-常用属性
语法 | 作用 |
---|---|
request.method |
取该次请求类型(GET 或 POST) |
request.GET |
返回此次GET请求内容(字典形式 ) |
request.POST |
返回此次POST请求内容(字典形式 ) |
request.path |
获取访问路径(仅路径)如:访问首页值:/index/ |
…. | …. |
request-常用方法
语法 | 作用 |
---|---|
request.get_full_path() |
取访问路径加信息(含访问信息)例如:"/music/bands/the_beatles/?print=true" |
request.is_ajax() |
如果请求是通过XMLHttpRequest 发起的,则返回True |
响应对象 - 返回页面
render 如果带蒙版语法,那么render就会把html页面(蒙版文件)渲染成真正的html
语法 | 作用 |
---|---|
HttpResponse |
直接返回渲染的页面:例:return HttpResponse(<h1>页面</h1>) |
render |
返回写好的页面 例:return render(request,'页面名',可选参数:{"time":值}) |
【{ }模版语法】
模版语法种类
HTML中花括号的使用,加载页面的时候渲染{}
作用 | 语法 |
---|---|
用key取值 | 渲染变量 {{ key名}} |
取别名路径 | 渲染标签 action={% url 'log' %} 取别名log的路径并返回 |
{{ }}变量传输、获取
传输
# 字典、列表、都可以传给HTML
name = 'zok'
l = [111,2322,333]
info = {'name':'zok','age':22}
# 传方法1:
return render(request,'index.html',{'name':name})
# 传方法2:locals()把局部变量引到html中,比较方便
return render(request,'index.html',locals())
获取
# html中深度查询,就是传过来是个字典, 要字典中的某个值
# <p>{{info.name}}{/p} # 都是用点,列表就是点索引
{% % }
| 过滤数据后再显示页面
内置过滤器(常用)