Django框架学习--2--路由配置&请求

本篇文章核心内容:

1.两种不同的路由配置方法

2.post和get请求的相关概念及与浏览器中的交互体现

1.一般路由配置的方法

        settings.py中的"ROOT_URLCONF"指定主路由文件中的urlpatterns配置列表找到文件位置

例如在 path('page/2022/', views.page_2022_view) 中会找到后面的视图函数。

path()函数
导入方式from django.urls import path
语法path(route匹配请求路径,views指定路径对应的视图处理函数, name= None地址起别名)

 1.1 使用path转换器来匹配url

转换器例如:path('page/<int:page>', views.xxx)语法:<转换器类型:自定义名>

 例如的结果

        转换器类型

str匹配除'/'之外的非空字符 (usually)
int匹配0或任何正整数,返回一个int (usually)
slug

匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签 detail/<slug:sl> --> /detail/this-is-djang  

path匹配非空字段,包括路径分隔符'/'

1.2 利用转换器功能写一个小计算机

 匹配格式: http://127.0.0.1:8080/整数/操作符/整数

# urls.py
import share.views as shview
path('int:n>/<str:op>/<int:n>',shview.cal_views)
# views.py
def cal_views(request, a, op, b):
    if op not in ['add','sub', 'mul','div']:
        return HttpResponse('your op is wrong')
    result = 0
    if op == 'add':
        result = a+b
    if op == 'sub':
        result = a-b
    if op == 'mul':
        result = a*b
    if op == 'div':
        result = a/b
    return HttpResponse('运算结果:%s'%(result))

最终结果:


2.使用正则的路由配置方法

2.1 进一步需求:对整数的位数有要求,比如只能算2位数之间的运算

re_path()函数
引入方式from django.urls import re_path
语法re_path(reg, view, name=xxx)
特点匹配提取后的值进行关键字传参,和path()函数一样

解决方案:re_path(r'^(?P<x>\d{1,2}/(?P<op>\w+)/(?P<y>\d{1,2})$‘, views.cal_view),

命名分组模式(?P<name>pattern)

r'str'原始字符串
^以后面的字符或分组开头
?P<x>

定义一个x的命名分组, w+多个字母

 2.2 示例2:匹配年月日

匹配格式:http://127.0.0.1:8080/birthday/(year)/(month)/(day)

#urls.py
import share.views as shview 
re_path(r'^birthday/(?P<y>\d{4}/(?P<m>\d{1,2})/(?P<d\{1,2}))$',shviews.birthday_view)
#views.py 
def birthday_view(request ,y ,m ,d):
    html = "{}年{}月{}日".format(y,m,d)
    return HttpResponse(html)


 3.请求和响应

        请求是浏览器通过HTTP协议发送给服务端的数据,响应是指服务器接收请求后做出相应的处理再回复给浏览器段的数据。

3.1 HTTP协议的请求方法

有以下几种:GET ,HEAD ,POST ,PUT, DELETE, CONNECT, OPTIONS(服务器的性能),

TRACE (回显服务器收到的请求(诊断,测试))。

django接受到http协议的请求后,会根据请求数据创建HttpRequest对象;如下面代码,test_request视图函数第一个参数就是request对象,通过调用test_request函数显示相应函数方法功能。

from django.http import HttpResquest,HttpResponse 

def test_request(request):
    print('path info is', request.path_info) # 使用get_full_path()显示完整路径
    print(''method is', request.method) 
    print('querystring is', request.GET) # 显示查询字符串
    return HttpResponse('test request ok')
​

3.2 响应

 HTTP响应状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 302 - 资源(网页等)被临时转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

响应对象 HttpResponse(content=, content_type=, status=)

例如 return HttpResponseRedirect('/page/1') 重定向资源到另一个url

3.3 get请求和post请求

如下函数把post和get分开进行处理

def test_get_post(request):
    if request.method == 'GET':
        print(request.GET['a'])
        print(request.GET.get('c','no exist'))
        return HttpResponse(POST_FORM)
    elif request.method == 'POST':  # 服务端接受请求
        print('uname is ',request.POST['uname'])
        return HttpResponse('post is ok')
    else:
        pass
    return HttpResponse('--test get post --')

request两中GET方法,POST类似

request.GET['参数名']字典形式获得,没有会触发keyError
request.GET.getlist() 查询字符串出现多个同名key,把value取出形成列表,应用场景: 问卷调查 -兴趣爱好 - 复选框

  post 方法适用于隐私数据的提交,客户端通过表单等post请求将数据传递给服务器端

<form method = 'post' action='/login'> 

    <input type ="text" name= "username">

    <input type= 'submit' value = '登录'>

</form>
<!-- post表单->

        当在路由和视图模块中完成以上添加后,输入url:http://127.0.0.1:8080/test_get_post会发现报错;因为post提交会有一种网络攻击CSRF(大致了解一下)

解决方案:

  • 注释middleware(settings.py)中 django.middleware.csrf...那一行就不会报错
  • 在django中我们需要在templates的form中加入 {%csrf_token%}这串内容

最终结果:
 

 
 

 课程地址:2021最新版Django全套视频(django框架快速上手)_Python全栈_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值