Django 基础知识、常用模块、路由、视图、模版语法

【Django 简介】

post 与 get 取值

postget

  • 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}  # 都是用点,列表就是点索引

{% % }

| 过滤数据后再显示页面

内置过滤器(常用)

猜你喜欢

转载自blog.csdn.net/weixin_42329277/article/details/81367168