Django路由分组

通过上次的学习,我们已经对Django有了简单的了解,现在来深入了解下~

1. 路由系统

   1.1 单一路由对应

       a. urls

url(r'^login/', views.login),   # login ---> 函数名 views.login

      b. templates目录下的login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>

<body>
    <form action="/login/" method="POST" enctype="multipart/form-data">
        <p>
            <input type="text" name="user" placeholder="用户名"/>
        </p>
        <p>
            <input type="password" name="pwd" placeholder="密码"/>
        </p>
        <p>
            男:<input type="radio" name="sex" value=""/>
            女:<input type="radio" name="sex" value=""/>
        </p>
        <p>
            <select name="city" multiple="multiple">
                <option value="bj" >北京</option>
                <option value="sh" >上海</option>
                <option value="sz" >深圳</option>
            </select>
        </p>
        <p>
            <input type="file" name="upload"/>
        </p>
        <p>
            <input type="submit" value="提交"/>
        </p>
    </form>

</body>
</html>
View Code

    c. views视图

USER_LIST = {}
def login(request):
    if request.method == 'GET':    #判断请求方式
        return render(request, 'login.html')
    elif request.method == 'POST':
        user = request.POST.get('user')   #post请求,单选、输入框获取值
        pwd = request.POST.get('pwd')
        sex = request.POST.get('sex')
        #多选获取值
        city = request.POST.getlist('city')

        # 上传文件
        upload_file_obj = request.FILES.get('upload')
        print(type(upload_file_obj), upload_file_obj)  #<class 'django.core.files.uploadedfile.InMemoryUploadedFile'> 2.jpg
        #保存上传的文件到upload目录
        upload_path = os.path.join('upload', upload_file_obj.name)
        fw = open(upload_path, 'wb')

        for line in upload_file_obj.chunks(): #chunks表示所有的数据库,是个迭代器
            fw.write(line)
        fw.close()

        if user and pwd:
            USER_LIST['name'] = user
            USER_LIST['pwd'] = pwd
            USER_LIST['sex'] = sex
            USER_LIST['city'] = city
            USER_LIST['file'] = upload_file_obj.name
            return render(request, 'success.html', {"user_list": USER_LIST})
        else:
            return HttpResponse('请求不能为空')
    else:
        return HttpResponse('请求方式不是get\post')   #HttpResponse("字符串")
View Code

  1.2  基于正则的路由

    a. urls 路由设置

 # url(r'^detail/', views.detail),   #常规url方式,针对某个方法的写法
    url(r'^detail-(\d+).html', views.detail),  #通过正则匹配url,形式是:  detail-xx
View Code

   b, templates目录下的 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <!--
       <ul>
        {% for k,v in user_dict.items %}
            <li><a target="_blank" href="/detail/?nid={{ k }}">{{ v.name }}</a></li>
        {% endfor %}
     </ul>
 -->
    <ul>
        {% for k,v in user_dict.items %}
            <li><a target="_blank" href="/detail-{{ k }}.html">{{ v.name }}</a></li>
        {% endfor %}
    </ul>
</body>
</html>
View Code

  c. views视图

USER_DICT = {
     "1": {"name": "root1", "email": "qwe1@163.com"},
     "2": {"name": "root2", "email": "qwe2@163.com"},
     "3": {"name": "root3", "email": "qwe3@163.com"},
     "4": {"name": "root4", "email": "qwe4@163.com"},
}
def index(request):
    return render(request, 'index.html', {"user_dict": USER_DICT})

#单一路由对应
# def detail(request):
#     nid = request.GET.get('nid')   #get请求方式,或者到nid的值,即USER_DICT的key
#     detail_info = USER_DICT[nid]
#     return render(request, 'detail.html', {"detail_info": detail_info})

#正则路由
def detail(request, nid):
    # nid指定的是(\d+)里的内容
    detail_info = USER_DICT[nid]
    return render(request, 'detail.html', {"detail_info": detail_info})
View Code

  1.3 正则分组

     如果url涉及多个数字拼接,怎么区分接受的数据是nid ? 还是tid?

    a, 在url.py增加对应路径

url(r'^index/', views.index),
    # url(r'^detail/', views.detail),   #常规url方式,针对某个方法的写法
    # url(r'^detail-(\d+).html', views.detail),  #通过正则匹配url,形式是:  detail-xx
    url(r'^detail-(?P<nid>\d+)-(?P<tid>\d+).html', views.detail),  #通过正则分组,形式是:  detail-xx-xx
View Code

 b, templates目录下的 index.html

     <ul>
        {% for k,v in user_dict.items %}
            <li><a target="_blank" href="/detail-{{ k }}-9.html">{{ v.name }}</a></li>
        {% endfor %}
    </ul>
View Code

c. views视图

#正则路由
# def detail(request, nid):
#     # nid指定的是(\d+)里的内容
#     detail_info = USER_DICT[nid]
#     return render(request, 'detail.html', {"detail_info": detail_info})

def detail(request, **kwargs):
    print(kwargs)   # {'nid': '1', 'tid': '9'}
    nid = kwargs.get("nid")
    detail_info = USER_DICT[nid]
    return render(request, 'detail.html', {"detail_info": detail_info})
View Code

1.4  为路由映射名称

    如接口名称进行了变更,多次变更,涉及的trmplates、views 都需要进行修改,有什么办法可以解决这种方式?  urls 路由设置name。

   a, 在url.py增加name属性

urlpatterns = [
    url(r'^asdfasdf/', views.exmplas_urls, name="demo1"),
    url(r'^buy/(\d+)', views.exmplas_urls, name="demo2"),
    url(r'^check/(?P<nid>\d+)/(?P<tid>\d+)', views.exmplas_urls, name="demo3"),

]

b. view视图

#为路由映射名称
def exmplas_urls(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        return render(request, 'demo.html', {'user': user})
    else:
        return render(request, 'demo.html')


#为路由映射名称
def exmplas_urls(request, nid):
    print(nid)
    if request.method == 'POST':
        user = request.POST.get('user')
        return render(request, 'demo.html', {'user': user})
    else:
        return render(request, 'demo.html')

#为路由映射名称
def exmplas_urls(request, **kwargs):
    print(kwargs)  #{'nid': '3', 'tid': '9'}
    if request.method == 'POST':
        user = request.POST.get('user')
        return render(request, 'demo.html', {'user': user})
    else:
        return render(request, 'demo.html')
View Code

c. templates目录下的 demo.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>urls映射名称</title>
</head>
<body>

    <!--1. 常规写法  action="/asdfasdf/"  优化写法:action="{% url "demo1" %}"
        2. url正则  action="buy/6"  优化写法: action = {% url "demo2" 6 %}
        3. url分组  action = "check/6/9"   优化写法: action = {% url "demo3" nid=3 tid=9 %}
     -->
    {{ user }}
    <form action="{% url "demo3" nid=3 tid=9 %}" method="POST">
        <p><input type="text" name="user" placeholder="用户名"/></p>
        <p><input type="password" name="pwd" placeholder="密码"/></p>
        <p><input type="submit" name="提交"/></p>
    </form>
</body>
</html>
View Code

 1.5 获取当前URL

view.py中配置:

def login(request):
    print(request.path_info)
    return render(request, 'path.html')
View Code

在templates目录下的path.html文件

转载于:https://www.cnblogs.com/lhly/p/11110338.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中,由(routing)是指将URL(统一资源定位符)映射到相应的视图函数或类的过程。Django使用URLconf(URL配置)来配置由。 URLconf是一个Python模块,它定义了URL模式和对应的处理函数或类。Django通过匹配URL模式来确定应该调用哪个处理函数或类来处理请求。下面是一些关于Django由的详细解释: 1. 根URLconf:每个Django项目都有一个根URLconf,它负责处理项目的根URL。这个根URLconf通常是项目目录中的urls.py文件,它定义了项目的顶级URL模式。 2. URL模式:URL模式是一个正则表达式(或字符串),用于匹配请求的URL。它可以包含变量和其他特殊字符来提取URL中的参数。URL模式在根URLconf和应用程序的URLconf中定义。 3. 处理函数或类:当URL模式与请求的URL匹配时,将调用相应的处理函数或类来处理请求。处理函数可以是常规的Python函数,也可以是基于类的视图。处理函数或类负责处理请求并返回响应。 4. 命名URL:Django允许为每个URL模式分配一个唯一的名称。这样可以使得在代码中引用URL更加方便和可维护。命名URL可以通过名称反向解析为对应的URL。 5. 包含(include):Django由系统支持将URL模式划分为不同的模块。可以使用include函数将其他URLconf包含到主URLconf中,实现由的分发和管理。 6. 参数传递:URL模式可以包含变量,这些变量可以从URL中提取出来,并作为参数传递给处理函数或类。这样可以实现动态的URL匹配和处理。 7. URL分发和重定向:Django允许将请求分发到不同的处理函数或类,并支持URL重定向。这样可以实现将请求从一个URL转发到另一个URL。 总的来说,Django由系统提供了灵活和强大的功能,可以帮助开发者管理项目中的URL,并将请求分发到适当的处理函数或类。通过定义URL模式和处理函数或类,可以实现对不同URL的定制化处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值