zoukankan      html  css  js  c++  java
  • Django框架详解之url

    Django基本命令

    下载Django

    pip3 install django

    创建一个django project

    django-admin.py startproject cms

      当前目录下会生成cms的工程,目录结构如下:

      setting.py --- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量

      urls.py --- 负责把url模式映射到应用程序

      wsgi.py --- 用于开发服务器和生产WSGI部署

      manage.py --- Django项目里面的工具,通过它可以调用django shell和数据库等

    创建应用

      在cms目录下创建应用

    python manage.py startapp app01

    启动django项目

    python manage.py runserver 8000

    同步更改数据库表或字段

    python manage.py makemigrations
    python manage.py migrate

      这种方法可以创建表,当你在modles.py中新增了类时,运行它就可以自动在数据库中创建表了

    查看所有的命令

      查看所有命令,忘记子名称的时候有用

    python manage.py

    静态文件配置

    STATIC_URL = '/static/'
    STATICFILRS_DIRS = (
        os.path.join(BASE_DIR, 'static'),
    )

    MTV模型之url路由配置系统

    正则字符串参数

      简单配置

    from django.conf.urls import url
    from django.contrib import admin
    from app01.views import *
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^my_day/([0-9]{4})/$', my_day),
        url(r'^my_day/([0-9]{4})/([0-9]{2})/$', my_day2),
        url(r'^my_day/([0-9]{4})/([0-9]{2})/([0-9]{2})/$', my_day3),
    ]
    
    # 一旦匹配成功则不再继续
    # 若要从url中捕获一个值,只需要在它周围放置一对圆括号
    # 不需要添加一个前导的反斜杠,因为每个url都有(^my_time 而不是^/my_time)
    # 每个正则表达式前面的r是可选的但是建议加上
    def my_day(request,year):
        return HttpResponse(year)
    
    def my_day2(request,year,month):
        return HttpResponse('%s-%s'%(year,month))
    
    def my_day3(request,year,month,day):
        return HttpResponse('%s-%s-%s'%(year,month,day))
    code
    #设置项是否开启URL访问地址后面不为/跳转至带有/的路径
    APPEND_SLASH=True
    View Code

       有名分组(named group)

      上面的示例使用的是没有命名的正则表达式组,在更高级的用法中可以使用命名的正则表达式组,在python正则表达式中,命名正则表达式组的语法是(?P<name>pattern)

    from django.conf.urls import url
    from app01.views import *
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^my_day/(?P<year>[0-9]{4})/$', my_day),
        url(r'^my_day/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', my_day2),
        url(r'^my_day/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', my_day3),
    ]
    #捕获的值作为关键字参数而不是位置参数传递给视图函数

      urlconf查找

      urlconf在请求的url上查找,将它当作一个普通的python字符串,不包括GET和POST参数以及域名

    http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/。
    
    http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/。
    example

      urlconf捕获的参数永远是字符串

      每个捕获的参数都作为一个普通的python字符串传递给视图

      指定视图参数的默认值

    from django.conf.urls import url
    from app01.views import *
    
    urlpatterns = [
        url(r'^my_day/(?P<year>[0-9]{4})/$', my_day2),
        url(r'^my_day/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', my_day2),
    ]
    urlconf
    def my_day2(request,year,month='3'):
        return HttpResponse('%s-%s'%(year,month))
    view

      两个url都指向同一个视图,如果第一个模式匹配,视图函数将使用参数的默认值;如果第二个模式匹配,视图函数将使用正则表达式捕获的值

      Including other URLconfs

    from django.conf.urls import url
    from django.contrib import admin
    from django.conf.urls import include
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01', include('app01.urls'))
    
    ]

    传递额外的选项给视图函数

      urlconfs具有一个钩子,让你传递一个python字典作为额外的参数传递给视图函数

    from django.conf.urls import url
    from django.contrib import admin
    from app01.views import *
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^my_day/(?P<year>[0-9]{4})/$', my_day2, {'foo':'bar'}),
    ]
    
    #django.conf.urls.url()函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数

    url反向解析

       在模板中,Django使用url模板标签用于反向解析url

    from django.conf.urls import url
    from app01.views import *
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^hello', my_hello, name='little_hello'),
    ]
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>my_day</title>
    
    </head>
    <body>
    <a href="{%url 'little_hello'%}">点我跳转</a>
    </body>
    </html> 
    #示例二
    <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
    
    <ul>
    {% for yearvar in year_list %}
    <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
    {% endfor %}
    </ul>

      在python代码中,可以这样使用

    from django.core.urlresolvers import reverse
    from django.http import HttpResponseRedirect
    
    def redirect_to_year(request):
        # ...
        year = 2006
        # ...
        return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

    名称空间

      Namespace是表示标识符的可见范围。一个标识符可在多个名称空间中定义,它在不同名称空间中的含义是互不相干的。这样,在一个新的名称空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名称空间中

      由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回。当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种错误,引入了名称空间

      Project.urls

    from django.conf.urls import url,include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01/',include("app01.urls",namespace='app01')),
        url(r'^app02/',include("app02.urls",namespace='app02')),
    ]

      app01.urls

    from django.conf.urls import url
    
    urlpatterns = [
        url(r'^index/', index,name="index"),
    ]

      app02.urls

    from django.conf.urls import url
    
    urlpatterns = [
        url(r'^index/', index,name="index"),
    ]

      app01.views

    from django.core.urlresolvers import reverse
    
    def index(request):
    
        return  HttpResponse(reverse("app01:index"))

      app02.views

    from django.core.urlresolvers import reverse
    
    def index(request):
    
        return  HttpResponse(reverse("app02:index"))
  • 相关阅读:
    Android调用浏览器打开网址遇到的问题
    TexturePacker压缩png的命令
    碎碎念
    推荐几款API文档集合工具
    XCode打包脚本
    Android手机提示“未安装应用程序”
    移动环境下DNS解析失败后的优化方案
    7z压缩与解压命令
    Lua的文件操作
    IOS判断用户的网络类型(2/3/4G、wifi)
  • 原文地址:https://www.cnblogs.com/iamluoli/p/8862150.html
Copyright © 2011-2022 走看看