首页 > 其他 > 详细

Django笔记4---路由系统

时间:2019-12-03 13:47:00      阅读:80      评论:0      收藏:0      [点我收藏+]

Django的路由系统
Django的路由系统指的是路径和函数的对应关系,之前只知道在urls.py内修改urlpattern的内容,知道正则匹配的路径开头与视图的匹配关系.

Django的路由系统在Django中叫做URLconf系统,就像Django维护的一个目录,本质是URL与要为该URL调用的视图之间的映射表.来看看Django 1.11的URLconf官方文档是怎么说的吧:

针对Django里的app,想让其正常工作,也要为其设计一套URL以便浏览器访问该app不同的功能.在设计一个app的URL时,会建立一个Python模块,我们非正式的将其称作URLconf. URLconf用纯Python语言编写,提供了URL路径样式(正则表达式)与视图函数的对应关系.URLconf可长可短,还可以引用其他的映射关系,也可以动态生成.

简明的说,URLconf就是一个py文件,里边写上了URL和视图的对应关系,放在项目下边,作为URLconf配置文件.当有请求进来的时候,就会按照其中的配置发挥作用.URLconf文件的名称也可以自定义.在项目的根目录下约定俗成采用urls.py当做初始的URLconf配置文件.

URLconf配置文件

URLconf文件

from django.conf.urls import url
urlpatterns = [
url(regex, view, kwargs=None, name=None),]
在URLconf配置文件的开始部分,必须导入url.然后在文件中设置一个叫做urlpatterns的列表,其中的每一个元素,都是url的实例.
url可接受4个参数:

regex 是正则表达式
view 是视图函数(类)名
kwargs是一个字典,是可选的,包含额外传递给视图的参数
name是一个别名,稍后解释
制作了这样一个文件之后,这个文件就是当前站点的URLconf文件.

正则匹配详解
正则部分的匹配,是从域名加上表示根目录的/之后开始匹配的,对于常见的GET加参数的请求为例:

http://www.conyli.cc:8000/wp-admin/?article=1109
这行URL传到Django之后,Django用其中的wp-admin/部分与URLconf进行匹配,之前的域名,端口,第一个表示根目录的”/”以及表示参数的部分都会被忽略,只用wp-admin/部分.
在之前的项目中,一直使用类似:

url(r‘^item_edit/‘, views.item_edit)
这样的模式.之前没有深究,现在可以看看具体的匹配了.

匹配item_edit/开头的URL,类似item_edit/new/也会匹配成功

r‘^item_edit/‘

精确匹配,仅能匹配"item_edit/",再有子路径无法匹配成功

r‘^item_edit/$‘

批量匹配一批由任意数字排序的URL,比较常用在内容管理系统内.

r‘^book/[0-9]{2,4}/$‘

分组,匹配类似book/333/ab/这样的URL,注意,如果采用分组,分组匹配的部分会把值传递给对应的视图函数.

r‘^book/([0-9]{2,4})/([a-zA-Z]{2})/$‘

分组命名匹配,与分组类似,但是给每个分组按照正则规则命名,会按照关键字传入视图函数

r‘^articles/(?P[0-9]{4})/$‘
上边的几种例子中,最后两种最为重要.仅分组不命名的情况下,匹配的url部分按照位置参数的方式传递给视图函数(视图函数必须采取各种方法接收:比如定义位置参数,采用默认值或者定义*args来接收参数).分组且命名的情况下,匹配成功的url部分按照关键字参数的方式传给视图函数(视图函数需要定义对应的关键字参数或者**kwargs用于接收关键字参数).

在今后编写URLconf和视图函数的时候,对于不需要传递字符串或者不需要返回给用户一个可重用的具体链接的时候,最好都尽量采用URLconf体系.
总结一下URLconf里的注意事项:

URLconf内的匹配顺序是从上到下,取第一个匹配成功的视图执行响应,后边不再匹配
如果要捕获URL的一部分,在对应的正则匹配的地方用分组元字符,还可以命名.匹配的值会传递给视图函数
正则的开头不要写”/”,这个不属于路径的一部分
最好用r字符串传格式,否则会面临正则二次转义的问题
所有正则捕获传递给视图函数的值都是字符串类型,需要注意视图函数中的类型转换.
正则表达式不检查请求类型,GET POST等都是按照同样的路径解析方式
还有一个小要点是,Django 对于末尾没有/的路径,会自动加上”/”然后在用这个URL去匹配,如果想关闭该功能,需要在settings.py中加上 APPEND_SLASH=False 即可.默认是True.用的不多.

由于分组传递参数的功能,以及视图函数是纯python代码的灵活性,可以实现各种批量URL处理的功能.比如不指定具体路径的时候默认返回第一页的内容:

urls.py中

from django.conf.urls import url

from . import views

urlpatterns = [
url(r‘^blog/$‘, views.page),
url(r‘^blog/page(?P[0-9]+)/$‘, views.page),]

views.py中,可以为num指定默认值

def page(request, num="1"):
pass
这个url与函数的搭配就实现了如果直接输入/blogs/默认返回第一页,输入/blogs/9/会返回第9页的功能.

多重路径匹配
一开始的时候说过,只要符合URLconf配置标准的文件都可以用来进行路径解析.在路径解析的时候,对于某一个路径,还可以引入其他的路径解析文件继续再当前的基础上解析.这就类似一级路由转发给二级路由,让路径解析变得模块化和易于扩展.在url内部采用include方式进行导入.例子如下:

from django.conf.urls import include, url

urlpatterns = [
url(r‘^admin/‘, admin.site.urls),
url(r‘^blog/‘, include(‘blog.urls‘)),]

其中的blog.urls就是另外一个URLconf文件.会继续拿着以"blog/"开头的路径进行解析.

传递额外参数给视图函数
url的第一个参数正则表达式已经学习完毕.第二个参数已经知道是视图函数或者类,类用as_view()来注册.
现在看第三个参数.
第三个参数Kwargs是一个可选的字典类型的参数,如果不传,就不会给视图函数传入参数.如果传了参数,这个字典会被拆解成关键字参数传给视图函数.举个例子:

from django.conf.urls import url
from . import views

urlpatterns = [
url(r‘^blog/(?P[0-9]{4})/$‘, views.year_archive, {‘foo‘: ‘bar‘}),]
这里正则用命名分组,url还带一个字典参数,假设如果year分组匹配到2019的话,views.year_archive函数接受到的参数有:默认的request, year=2019, foo = “bar”.这个在某些场景下有使用.

命名URL和URL反向解析
最后这一部分就是url的第四个参数即name=None.这个name实际上就是给匹配的那段url起一个别名.
先来看一个例子,用来理解什么叫做反向解析:
在模板里,经常会写各种超链接,尤其是在网站内部跳转的超链接,之前的项目经常写成这样:

录入单据
这样做的最大问题就是跳转的链接被硬编码了,一旦更改了url里的路径匹配,则所有用到该路径的模板全部需要重写路径.
这个时候就要用到name别名来通过别名来反向解析指定的url,不用硬编码.
修改urls.py里的内容改成如下:

url(r‘^move_add/‘, views.move_add,name="io_ticket")
然后在模板内采用url tag 来写成如下:

<a href="{% url "io_ticket" %}?id={{ item.id }}" class="btn btn-primary">录入单据
此时打开页面,可以看到比如修改urls.py里的move_add为move_plus,刷新页面之后,a标签的链接也会同步变动,依然由原来的函数接受,便不用再具体更改页面中的链接.

所谓反向解析,是URLconf文件提供的一种对应机制,不仅通过匹配URL从而找到处理该请求的视图函数,还能够通过名字找到当时匹配的URL.刚才解决了模板内硬编码的问题,但是在后端代码里,视图函数的函数体和重定向的过程中,还有可能硬编码了路径,这个时候就要看如何在普通代码和重定向的时候使用反向解析.

反向解析在视图函数的重定向方法里的使用,以返回上一个例子的URL为例:

需要先导入反向解析函数

from django.urls import reverse

reverse_url = reverse("io_ticket")
redirect(reverse_url)
这样就可以返回反向解析后的路径了.

解决了绝对路径硬编码的问题,还有一个问题需要解决,就是我的io_ticket别名对应的内部路径其实是一个死路径/move_add/,没有用到正则表达式里的匹配符号,如果是下边这种情况,如何取得确定的URL呢?

url(r‘^blog/(?P[0-9]{2,4})/(?P[a-zA-Z]{2})$‘, views.year_archive,name="archive")<br /> 在Djaogo里如果直接对archive用reverse方法,Django会报一个NoReverseMatch错误,因为通过archive虽然找到了URLconf中的对应关系,但对应的是一个不确定的正则表达式,这个时候如果想要得到确定的URL,就必须给reverse函数传递参数.<br /> 上边的redirect代码部分就要修改成:</p> <p>from django.urls import reverse</p> <p>reverse_url = reverse("archive",kwargs={"year":2018,"title":"xb"})<br /> redirect(reverse_url)<br /> 这段代码就是把需要解析的路径别名,给路径别名传递的关键字参数,都交给reverse函数处理,这样就动态的得到了URL.<br /> 这里的URL是分组且命名的,如果分组不命名,则要给reserve的第二个参数传递一个元组,其中按照位置顺序传值,即可得到实际的URL.<br /> 模板中的url tag,也可以用{% url “archive” 参数 %}来给模糊的URL传值.</p> <p>看一个用反向解析实现按照年份显示文章的例子:</p> <h1 id="urlconf配置文件用来匹配articlesxxxx这种路径x为任意数字">URLconf配置文件,用来匹配articles/xxxx/这种路径,x为任意数字</h1> <p>urlpatterns = [<br /> url(r‘^articles/([0-9]{4})/$‘, views.year_archive, name=‘news-year-archive‘),]<br /> 在模板中使用url tag 并且传递参数来设置路径:</p> <h1 id="模板内使用url-tag-加参数来反向解析url">模板内使用url tag 加参数来反向解析URL</h1> <ul> {% for yearvar in year_list %} <li><a href="{% url ‘news-year-archive‘ yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul> <p>url后边跟着别名,由于别名的正则表达式有一个分组,所以将年份变量yearvar 传给 url tag,得到的实际URL,就是articles/xxxx/,其中xxxx为year_list其中的所有年份的一系列URL链接.这个功能实际上就是按年份建立了所有的路径,视图函数在接受这个链接的时候,就知道去取哪一年的文章展示出来.</p> <p>在视图函数中解析URL:</p> <p>def redirect_to_year(request):<br /> year = 2018<br /> return redirect(reverse(‘news-year-archive‘, args=(year,)))<br /> 给reverse的变量部分传递了一个元组,元组的唯一一个元素是year,就相当于给反向解析的URL传递了第一个位置参数year.所以redirect的URL是articles/2018/.</p> <p>总结一下反向解析:</p> <p>没有模糊匹配的正则表达式起别名<br /> 在模板中用{% url name %}来反向解析<br /> 在代码中用reverse(name)来反向解析<br /> 有模糊匹配,只分组,未命名的正则表达式起别名<br /> 在模板中用{% url name arg… %}来反向解析<br /> 在代码中用reverse(name,(arg1,…))来反向解析<br /> 有模糊匹配,分组且命名的正则表达式起别名<br /> 在模板中用{% url name arg… %}来反向解析,这里官方文档未提到,估计是采用名字相同的变量,然后通过视图给变量传值<br /> 在代码中用reverse(name,kwargs={})来反向解析<br /> URL命名空间<br /> 所谓URL命名空间,就是如果两个URLconf文件都有相同的别名出现,可以通过’命名空间名称:URL名称’的语法来区别两个别名,命名空间名称就是app的名称.<br /> 模板中使用:</p> <p>{% url ‘app01:detail‘ pk=12 pp=99 %}<br /> 代码中使用:</p> <p>v = reverse(‘app01:detail‘, kwargs={‘pk‘:11})<br /> Django是如何处理URL的<br /> 作为总结,来看一下Django处理URL的顺序,修改自Github上一个Django文档的翻译:</p> <p>当一个用户请求Django站点的一个页面时,Django按照下面的顺序来确定哪些代码被执行:</p> <p>Django首先需要确定根URLconf模块。通常它是settings.py里 ROOT_URLCONF 设置的值,但是如果传入的HttpRequest对象有一个名为URLconf的属性(通过中间件请求处理设置),那么它的值将被使用来代替 ROOT_URLCONF 设置。<br /> Django加载所有的Python模块并在其中查找urlpatterns变量。它应该是一个以函数 django.conf.urls.patterns() 返回的Python列表,其中的每一个元素是一个django.conf.urls.url实例.<br /> Django 拿着HTTP请求,从所有已经获得的URLconf配置文件中,按顺序匹配每个正则表达式,并停止于第一个成功匹配,然后调用对应的视图。<br /> 一旦匹配成功,Django给对应的视图传递如下参数:<br /> HttpRequest的一个实例<br /> 分组但未命名的正则表达式按照位置参数传入<br /> 分组且命名的正则表达式按照关键字参数传入<br /> url实例化时候附带的字典参数作为关键字传入,如果这个字典里有和分组且命名的正则表达式关键字参数重名的关键字,则会覆盖正则的参数.<br /> 没有正则表达式匹配,或者如果在这个过程中的任意点抛出一个异常,Django会调用一个适当的错误处理视图。<br /> 上边已经介绍了所有路由系统的详细.Django的路由系统非常强大,通过正则表达式模糊匹配且能够给视图函数传参数的方法,建立起类似目录结果的URL体系,并且有序的将这些URL分发到不同的视图函数进行处理.</p> <p>从视图的角度来看,路由系统扩展了视图函数的处理范围.在了解路由系统之前,我们编写的视图函数仅对应一个具体的URL地址,通过路由系统,一个视图函数可以操作一批URL地址.</p> <p>通过反向解析的应用,在站点内部互相跳转就可以不用写硬编码.同时可以携带参数传递给视图函数,可以略去编写带参数的GET请求,统一以URL进行标识,降低了编写模板的复杂性.<br /> 建立站点时,预先设计路由系统非常重要,相当于整个站点的目录.结构清晰的路由设计对于编写视图和模板起到事半功倍的效果.今后在写Django项目的时候,尽量用上路由系统的高级特性以减轻开发工作量.</p><p><a href="http://www.bubuko.com/infodetail-3314877.html" title="Django笔记4---路由系统,bubuko.com" style="color:#ffffff">Django笔记4---路由系统</a></p><p>原文:https://www.cnblogs.com/bmxm/p/11976109.html</p></span> </div> <script type="text/javascript"> bubuko_load('content_after');</script> <div id="divcomment"> <div> <div class=" divtextaligncenter"> <div class="detailcai" id="infono"> <div class="detailcai1 colorboldlv"> 踩</div> <div class="detailcai2 colorboldlv"> (<span id="spanNo">0</span>)</div> </div> <div class="detailzan" id="infoyes"> <div class="detailzan1 colorboldCheng"> 赞</div> <div class="detailzan2 colorboldCheng"> (<span id="spanYes">0</span>)</div> </div> <div class="divfloatclear"> </div> </div> <div class="divtextalignright margintop10"> <div class="width100bi paddingleft10right10"> <span id="spanYesContent" class="colorboldCheng"></span>  <span id="spanNoContent" class="colorboldlv"></span>  <span id="spanBadContent" class="colorboldCheng"> </span> </div> </div> </div> <div class="divtextalignright margintop10"> <span class="detailjubao" id="infobad">举报</span> </div> <script type="text/javascript"> bubuko_load('comment_before');</script> <div id="comment" class="divtextalignleft margintop20"> <div class="detailpinglun1"> <span class="detailpinglun2 title6">评论</span> <span class="detailpinglun3">一句话评论(<span id="commentCount" class="colorboldCheng">0</span>)</span> </div> <div class="paddingtop20"> <div id="commentlistend" name="commentlistend" class="divtextaligncenter margintop20"> <span id="lblpage"></span> </div> </div> <div class="margintop20"> <form method="post" action="/ajaxjs/info_detail_commentadd.aspx"> <div class="divtextalignleft paddingtop20"> <div id="commenthf" class="divbackgroundcolor1"> </div> <div> <textarea name="tbcommentcontent" id="tbcommentcontent" disabled="disabled" class="tb" style="width: 680px; height: 120px;" ></textarea> </div> </div> <div class="divtextalignright paddingtop10 " style="display:none;"> <span id="addCommentTishi" class="colorboldCheng">登录后才能评论!</span> <span id="loginno"><input type="button" class="mbtn1" value="登录" onclick="location.href='login.aspx?returnUrl='+document.URL.replace(new RegExp('&', 'g'), '(_)')" /></span> </div> </form> </div> </div> </div> <script type="text/javascript"> bubuko_load('comment_after');</script> </div> </div> <div class="width30bi divfloatright"> <div class="paddingbottom20"> <!-- <script type="text/javascript"> document.write(unescape('%3Cdiv id="bdcs"%3E%3C/div%3E%3Cscript charset="utf-8" src="http://znsv.baidu.com/customer_search/api/js?sid=10743263978424259100') + '&plate_url=' + (encodeURIComponent(window.location.href)) + '&t=' + (Math.ceil(new Date() / 3600000)) + unescape('"%3E%3C/script%3E'));</script> --> </div> <script type="text/javascript"> bubuko_load('right_top');</script> <div class="width100bi divborder"> <div class="divtitle"> <div id="infofile1_div1" class="divfloatleft divtitlefont"> 分享档案</div> <div class="divfloatright"> <a href="/infotimemore.html" title="分享档案更多" class="colorCheng">更多></a> </div> <div class="divfloatclear"> </div> </div> <div class="divtextalignleft paddingleft10right10 margintop10bottom10 heightline30px"> <a class="taga" href="/infotime-20210923-1.html" title="2021年09月23日技术分享文章"> 2021年09月23日 (328)</a><br /> <a class="taga" href="/infotime-20210924-1.html" title="2021年09月24日技术分享文章"> 2021年09月24日 (313)</a><br /> <a class="taga" href="/infotime-20210917-1.html" title="2021年09月17日技术分享文章"> 2021年09月17日 (191)</a><br /> <a class="taga" href="/infotime-20210915-1.html" title="2021年09月15日技术分享文章"> 2021年09月15日 (369)</a><br /> <a class="taga" href="/infotime-20210916-1.html" title="2021年09月16日技术分享文章"> 2021年09月16日 (411)</a><br /> <a class="taga" href="/infotime-20210913-1.html" title="2021年09月13日技术分享文章"> 2021年09月13日 (439)</a><br /> <a class="taga" href="/infotime-20210911-1.html" title="2021年09月11日技术分享文章"> 2021年09月11日 (398)</a><br /> <a class="taga" href="/infotime-20210912-1.html" title="2021年09月12日技术分享文章"> 2021年09月12日 (393)</a><br /> <a class="taga" href="/infotime-20210910-1.html" title="2021年09月10日技术分享文章"> 2021年09月10日 (160)</a><br /> <a class="taga" href="/infotime-20210908-1.html" title="2021年09月08日技术分享文章"> 2021年09月08日 (222)</a><br /> </div> </div> <div class="width100bi margintop20 divborder"> <div class="divtitle"> <div id="infonew1_divtitle" class="divfloatleft divtitlefont">最新文章</div> <div class="divfloatright"> <a href="/info.html" id="infonew1_amore" class="colorCheng" title="最新文章更多>">更多></a></div> <div class="divfloatclear"> </div> </div> <div> <ul> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830785.html" title=" 6.0 scripts元素 1) 内嵌的 JavaScript 代码 <script type="text/javascript"> document.write("I love FishC.com!") </script> 2) 通过 src 属性引用来自外部代码文件 ..."> 2021/09/28 scripts  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830783.html" title=" 问题场景 后台不提供富文本存储,所以emoji表情入库会报错 需求要求前端在输入的时候过滤掉表情符号 全局的input 和富文本textarea输入框都需要过滤emoji表情 问题分析 1.每一个input写事件写正则校验代码量实在太多了还很麻烦;所以想用自定义全局指令,就不需要每个用到的地方都去引 ..."> vue自定义全局指令v-emoji限制input输入表情和特殊字符  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830781.html" title=" (1)今日计划 四则运算第二阶段 (2)源代码 package size; import java.util.*; import java.lang.Math; public class size { static int count=0; static int ccount=0; static i ..."> 9.26学习总结  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830780.html" title="vim操作 1. 只在指定的特定行中搜索 /pattern\%>27l # 搜索pattern, 搜索范围是27行以后, 其中l表示按行搜索 /pattern\%>27l\%<40l # 搜索pattern, 搜索范围是27行以后40行以前, 其中l表示按行搜索 注意, 不要在%>27l两边随便加空 ..."> vim操作  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830779.html" title=" 说明 主要是学习汇编 windows10 + notepad++ + DOSBox0.74 网上也有notepad++配置自动编译运行的教程,感觉不如手敲命令行原始链接来的快 中断和中断调用 就是调用Dos下的系统接口 中断一览表 MOV AH,09H INT 21H ..."> 深入理解计算机基础 第三章  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830778.html" title="记录一下自己将string作为参数传递的结果。(自己感觉与int等基本类型无异。) 1. string 以引用形式传递 #include <iostream>#include<string> using namespace std;void change_string(string& s){ cha ..."> C++ string 作为形参与引用传递(转)  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830777.html" title=" 常用加解密 1. md5 加密 import hashlib def private_passwd(passwd: str) -> str: return hashlib.md5(passwd.encode(encoding='UTF-8')).hexdigest() 2. base64 加解密 i ..."> python 加解密  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830775.html" title=" let array = [ { id: 1, name: "001", children: [ { id: 2, name: "002", }, ], }, { id: 3, name: "003", children: [] }, ]; function getFlatArr(arr) { ret ..."> JavaScript-对象数组里根据id获取name,对象可能有children属性  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830773.html" title=" SQL语句,追加内容: update 表名 set 字段=CONCAT(字段,'追加的内容') where 字段=? 参考链接:https://www.jb51.net/article/113454.htm ..."> SQL语句——保持现有内容在后面增加内容  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830769.html" title=" virsh [options]... [<command_string>]virsh [options]... <command> [args...] options: -c | --connect=URI hypervisor connection URI -d | --debug=NUM deb ..."> virsh命令文档  <span class="colorlv">2022-05-27</span></a> </li> </ul> </div> </div> <div class="width100bi margintop20 divborder"> <div class="divtitle"> <div id="jctop1_divtitle" class="divfloatleft divtitlefont">教程昨日排行</div> <div class="divfloatright"> <a href="/jiaocheng/" id="jctop1_amore" class="colorCheng">更多></a></div> <div class="divfloatclear"> </div> </div> <div class="divtextalignleft"> <ul> <li class="divullilist"> 1.<a href="/jiaocheng/detail-3742.html" title="list.reverse()" >list.reverse()</a></li> <li class="divullilist"> 2.<a href="/jiaocheng/detail-898.html" title="Django Admin 管理工具" >Django Admin 管理工具</a></li> <li class="divullilist"> 3.<a href="/jiaocheng/detail-1027.html" title="AppML 案例模型" >AppML 案例模型</a></li> <li class="divullilist"> 4.<a href="/jiaocheng/detail-51.html" title="HTML 标签列表(功能排序)" >HTML 标签列表(功能排序)</a></li> <li class="divullilist"> 5.<a href="/jiaocheng/detail-57.html" title="HTML 颜色名" >HTML 颜色名</a></li> <li class="divullilist"> 6.<a href="/jiaocheng/detail-64.html" title="HTML 语言代码" >HTML 语言代码</a></li> <li class="divullilist"> 7.<a href="/jiaocheng/detail-208.html" title="jQuery 事件" >jQuery 事件</a></li> <li class="divullilist"> 8.<a href="/jiaocheng/detail-303.html" title="jEasyUI 创建分割按钮" >jEasyUI 创建分割按钮</a></li> <li class="divullilist"> 9.<a href="/jiaocheng/detail-305.html" title="jEasyUI 创建复杂布局" >jEasyUI 创建复杂布局</a></li> <li class="divullilist"> 10.<a href="/jiaocheng/detail-336.html" title="jEasyUI 创建简单窗口" >jEasyUI 创建简单窗口</a></li> </ul> </div> </div> <script type="text/javascript"> bubuko_load('right_bottom');</script> </div> <div class="divfloatclear"> </div> </div> <script type="text/javascript"> bubuko_load('bottom');</script> <div class="width1000px divmargin0auto paddingtop20bottom20"> <div class="width1000px divborder margintop20"> <div class="youqingtitle"> <a title="友情链接">友情链接</a> </div> <div class="youqingcontent"> <a href='http://www.hubwiz.com/' title='汇智网在线编程学习' target='_blank'>汇智网</a>   <a href='http://www.5ibc.net' title='专注PHP程序员一站式免费学习站点' target='_blank'>PHP教程</a>   <a href='http://www.cnplugins.com/' title='插件网' target='_blank'>插件网</a>   <!--<a href='http://m.bubuko.com/doc3v35e/2022-03-31.html' title='王者荣耀' target='_blank'>王者荣耀</a> <a href='http://m.bubuko.com/doc0tx77/6.html' title='刺激战场' target='_blank'>刺激战场</a> <a href='http://m.bubuko.com/doc27/60.html' title='金铲铲' target='_blank'>金铲铲</a> <a href='http://m.bubuko.com/doc2022-03-31/rolne.html' title='冰封王座' target='_blank'>冰封王座</a> <a href='http://m.bubuko.com/doc20dq0/2022-03-31.html' title='魔兽世界' target='_blank'>魔兽世界</a> <a href='http://m.bubuko.com/docovgq9/2022-03-31.html' title='哔哩哔哩' target='_blank'>哔哩哔哩</a> <a href='http://m.bubuko.com/docuiwrn/27.html' title='狼人杀' target='_blank'>狼人杀</a> <a href='http://m.bubuko.com/doc91/74.html' title='元神' target='_blank'>元神</a> --> </div> </div> </div> <div class="bottomdiv"> <div class="width1000px divmargin0auto paddingtop20"> <div class="divfloatleft width500px"> <div class="height30px"> <a href="/about.html" title="bubuko.com关于我们">关于我们</a> - <a href="/contactus.html" title="bubuko.com联系我们">联系我们</a> - <a href="/guest.html" title="bubuko.com留言反馈">留言反馈</a> - 联系我们:wmxa8@hotmail.com </div> <div class="height30px"> © 2014 <a href="http://www.bubuko.com" title="bubuko.com技术分享">bubuko.com</a> 版权所有 </div> <div> <span class="colorlv">打开技术之扣,分享程序人生!</span> </div> <div class="paddingtop20 paddingbottom20"> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?5bb992e19249070395266c385ebea7c6"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>        <script> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </div> </div> <div class="divfloatright width500px"> </div> <div class="divfloatclear"> </div> </div> </div> <script type="text/javascript"> toptopmenu_i = "3"; infomenu_i = "11"; var mid = ''; var id = '3314877'; var idm = '702c0c'; var commentitemcount = '0'; var memberhost = ''; prettyPrint(); </script> <script src="/js/infodetail.js" type="text/javascript" charset="utf-8"></script> <script src="/js/member.js" type="text/javascript" charset="utf-8"></script> <script src="/js/bubukojs.js" type="text/javascript"></script> </body> </html>