PythonWeb框架之Django

Django

  简介:

  Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型Model,模板Template和视图View。此框架设计模式借鉴了MVC框架的思想,MVC是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

        

  下载:

  官网下载页面:https://www.djangoproject.com/download/

 

  安装:以Windows为例,

    其他操作系统的安装参考:http://www.runoob.com/django/django-install.html

cmd命令:等号后面填写要下载的版本号
pip install django==1.11.9

  创建一个Django项目:

cmd命令:
django-admin startproject 项目名称

 

  启动Django项目:

在Django项目目录下运行命令:
python manage.py runserver IP:端口

 

  配置settings.py文件:

    1,模板文件

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夹位置
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

 

    2,静态文件

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),  # 静态文件存放位置
]

 

    3,csrf中间件:用于验证用户表单提交,刚开始使用可以先注释掉,方便测试

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

  Django基础使用工具:

from django.shortcuts import HttpResponse, render, redirect

    1,HttpResponse

# 接收一个字符串参数,返回给浏览器
def test(request):
    return HttpResponse("OK")

    2,render

# 接收一个request参数和模板文件,动态填充数据给模板文件时,
还可以添加一个字典类型的参数,这些数据可以在模板文件中通过特定格式拼接到文件中然后返回给浏览器。
def test(request): return render(request, "test.html", {"name": "tom", "age": 18})

    3,redirect

# 接收一个URL参数,会跳转到此URL进行访问。
def test(request):
    return redirect("/test/")  # 可以是外网的URL也可以是当前项目中的URL

 

 

  APP功能模块:

  一个Django项目可以分为多个APP,用来隔离项目中不同功能模块的代码。 

    1,创建app

# 命令行运行
python manage.py startapp app名字

 

  路由系统:

URL与视图系统之间的映射关系。

1,映射格式

# 在urls.py文件中
from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]

url参数:

  • 正则表达式:一个正则字符串,用于匹配请求的url 
  • views视图函数:一个定义好的视图函数,用于处理对应的url请求
  • 参数:可以不传,一个字典类型的数据,用于给视图函数传递默认参数
  • 别名:可以不传,name=值,给映射起别名,用于其他地方通过别名获取url

2,正则分组匹配

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^test/([0-9]{4})/$', views.test),
]

正则表达式分组匹配(通过圆括号)可以捕获URL中的值并以位置参数形式传递给视图。

3,分组命名匹配

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^test/(?P<num>[0-9]{4})/$', views.test),
]

 

分组命名匹配的正则表达式组可以捕获URL中的值并以关键字参数形式传递给视图。

ps:视图函数通过参数接收到的数据都是字符串格式的!

分组命名匹配可以传递关键字参数,那么就可以在视图函数指定默认参数来提供默认值。例如:

# urls.py中
from django.conf.urls import url

from . import views

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

# views.py中,可以为num指定默认值
def page(request, num="1"):
    pass

 

4,include方法

当有多个APP功能模块时,url映射关系都写在项目目录下的urls.py中就比较容易混乱,所以一般会在对应的APP下面新建一个urls.py来设定自身的映射。这时候就可以使用include在项目urls.py中给不同的url请求指定对应的APP下面的urls.py,从而完成不同功能请求的匹配。

from django.conf.urls import include, url

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^blog/', include('blog.urls')),   # 指定到博客功能APP下面的urls
   url(r'^news/', include('news.urls')),   # 指定到新闻功能APP下面的urls
]

 

5,别名的使用

  1. 在项目函数中获取对应的url匹配:通过reverse来完成反向解析
    url(r'^home', views.home, name='home'),  # 给我的url匹配模式起名为 home
    
    # 在函数中引用
    from django.urls import reverse
    
    reverse("home")

     

  2. 在模板文件中引用
    {% url 'home' %} 

 当进行分组匹配时,就会需要参数,这时的引用方式为:

# 函数中
reverse('别名', args=(参数, ))

# 模板中
{% url '别名' 参数 %}

命名空间模式:可以通过命名空间可以在不同的APP中解析出唯一的URL。

# 项目目录下的urls.py
from django.conf.urls import url, include
 
urlpatterns = [
    url(r'^app01/', include('app01.urls', namespace='app01')), 
    url(r'^app02/', include('app02.urls', namespace='app02')),
]

解析使用方式:

# 函数中使用
reverse('app01:别名')  # 解析出app01下面的某个分组匹配对应的url

# 模板中使用
{% url 'app01:别名' %}

 

 

 

  

posted @ 2018-04-08 20:55  蔠缬艸  阅读(273)  评论(2编辑  收藏  举报