Django框架 学习过程

一、Django介绍

1.组件

  • 包含组件如下:

    • 基本配置文件/路由系统
    • 模型层(M)/模板层(T)/视图层(V)
    • CookiesSession
    • 分页及发邮件
    • Admin管理后台

2.用途

  • 用途一:网站/微信公众号/小程序后端开发

    浏览器 --HTTP请求--> Django
    <--HTTP响应--
  • 用途二:人工智能平台融合

    微信小程序 --HTTP请求--> Django --HTTP请求--> 人工智能系统
    <--HTTP响应-- <--HTTP响应--
    第三方打车平台 <--HTTP响应-- <--HTTP响应--

3.安装

  • 支持Python的版本 - 3.X
  • 在线安装

    • 虚拟机执行 sudo pip3 install django==3.2.11
    • 检查是否安装成功 sudo pip3 freeze|grep -i 'Django'

二、项目-结构

1.创建项目

  • 成功安装Django后,虚拟机终端会有 django-admin 命令
  • 执行 django-admin startproject 项目名 即可创建出对应项目文件夹
  • 例如 终端执行 django-admin startproject mysite1 ;则创建出mysite1项目

2.启动服务

  • 启动[测试开发阶段]
  • 1.终端cd到项目文件夹,例如 cd mysite1
  • 2.进入到项目文件夹后,执行python3 manage.py runserver 启动 django 服务

    • 注:该方式启动下,Django在前台启动服务,默认监听8000端口
  • 3.浏览器访问 http://127.0.0.1:8000 可看到django的启动页面

    • 注:如果想更换端口,则可以用python3 manage.py runserver 端口号

3.关闭服务

  • 方式1:在runserver启动终端下

    • 执行Ctrl+C可关闭Django服务
  • 方式2:在其他终端下

    • 执行sudo lsof -i:8000 查询出Django的进程id
    • 执行kill -9 对应Django进程id

4.启动常见问题

  • 问题:启动时报错

    Error:That port is already in use.

  • 问题原因:端口已被占用,证明当前Django启动时,默认监听的8000端口已被其天涯进程占用
  • 解决方案:关闭所占用8000端口的服务

5.结构解析

展开django项目目录,结构如下

1

5.manage.py

manage.py 包含项目管理的子命令,如:

  • python3 manage.py runserver 启动服务
  • python3 manege.py startapp 创建应用
  • python3 manege.py migrate 数据库迁移
  • ...
  • 直接执行 python3 manage.py 可列出所有的Django子命令

6.项目同名文件夹

项目同名文件夹 - mysite1/mysite1

  • __init__Python包的初始化文件
  • wsgi.pyWEB服务网关的配置文件 - Django正式启动时,需要用到
  • urls.py:项目的主路由配置 - HTTP请求进入Django时,优先调用该文件
  • settings.py:项目的配置文件 - 包含项目启动时需要的配置

7.settings.py

  • settings.py 包含了Django 项目启动的所有配置项
  • 配置项分为 公有配置 和 自定义配置
  • 配置项格式例:BASE_DIR='xxx'
  • 公有配置 - Django官方提供的基础配置

    • https://docs.djangoproject.com/en/3.2/ref/settings/

8.公有配置

  • BASE_DIR

    • 用于绑定当前项目的绝对路径(动态计算出来的),所有文件夹都可以依赖此路径
  • DEBUG

    • 用于配置Django项目的启动模式
    • True 表示开发环境中使用 开发调试模式(用于开发中)
    • False 表示当前项目运行在生产环境中
  • ALLOWED_HOSTS

    示例:如果要在局域网其他主机也能访问此主机的Django服务,启动方式如下:

    • python3 manege.py runserver 0.0.0.0:5000
    • 指定网络设备如果内网环境在其他主机想正常访问该站点,需加ALLOWED_HOSTS=['内网IP']

    设置允许访问到本项目的host头值

    • [ ]空列表,表示只有请求头中host127.0.0.1localhost能访问本项目 - DEBUG=True 时有效
    • ['*'],表示任何请求头的host都能访问到当前项目
    • ['192.168.1.3','127.0.0.1'] 表示只有当前两个host头的值能访问当前项目
  • INSTALLED_APPS

    • 指定当前项目中安装的应用列表
  • MIDDLEWARE

    • 用于注册中间件
  • TEMPLATES

    • 用于指定模板的配置信息
  • DATABASES

    • 用于指定数据库的配置信息
  • LANGUAGE_CODE

    • 用于指定语言配置

      • 英文:"en-us"
      • 中文:"zh-Hans"
  • TIME_ZONE

    • 用于指定当前服务器端的时区

      • 世界标准时间:"UTC"
      • 中国时区:"Asia/Shanghai"
  • ROOT_URLCONF

    • 用于配置主url配置'mysite1.urls'

      • ROOT_URLCONF='mysite1.urls'

9.自定义配置

  • settings.py 中也可以添加 开发人员 自定义配置

    • 配置建议:名字尽量个性化,以防覆盖掉公有配置

      • 例如:ALIPAY_KEY='XXX'
    • settings.py中的所有配置项,都可以按需的在代码中引入

      • 引入方式:from django.conf import settings

三、URL-结构

1.定义

  • 即统一资源定位符 Uniform Resource Locator

2.作用

  • 用来表示互联网上某个资源的资源

3.URL的一般语法格式

  • 注:[ ]代表其中的内容可省略:

    • protocol://hostname[:port]/path[?query][#fragment]

4.protocol(协议)http://baidu.com

  • http 通过HTTP访问该资源。格式 http://
  • https 通过安全的HTTPS访问该资源。格式 https://
  • file 资源是本地计算机上的文件。格式:file:///

5.hostname(主机名)http://baidu.com

  • 是指存放资源的服务器的域名系统(DNS)主机名、域名或IP地址

6.port(端口号)http://baidu.com:80

  • 整数,可选,省略时使用方案的默认端口
  • 各种传输协议都有默认的端口号,如http的默认端口为80

7.path(路由地址)http://baidu.com/video/showVideo

  • 由零个或多个"/"符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。路由地址决定了服务器端如何处理这个请求

8.query(查询)/video/showVideo?menuld=xxx&version=xxx

  • 可选,用于动态网页传递参数,可有多个参数,用"&"符号隔开,每个参数的名和值用"="符号隔开

9.fragment(信息片段)version=xxx#subject

  • 字符串,用于指定网络资源中的片段。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释

四、处理URL请求

  • 浏览器地址栏 --> http://127.0.0.1:8000/page/2003

    1. Django从配置文件中根据ROOT_URLCONF找到主路由文件;默认情况下,该文件在项目同名目录下的urls;例如mysite1/mysite1/urls.py
    2. Django加载主路由文件中的urlpatterns变量
    3. 依次匹配urlpatterns中的URL,匹配到第一个适合的中断后续匹配
    4. 匹配成功 - 调用对应的视图函数处理请求,返回响应
    5. 匹配失败 - 返回404响应
  • 主路由 - urls.py样例

    from django.contrib import admin
    from django.urls import path
    
    urlpatterns = [
      path('admin/', admin.site.urls),
      path('page/2003/',views.page_2003),
      path('page/2004/',views.page_2004),
    ]

五、视图函数

  • 视图函数时用于接收一个浏览器请求(HttpRequest对象)并通过HttpResponse对象返回响应的函数。此函数可以接收浏览器请求并根据业务逻辑返回相应的响应内容给浏览器
  • 语法

    def xxx_xxx(request[,其他参数...]):
      return HttpResponse对象
  • 样例

    • \# file:<项目同名文件夹下>/views.py

      from django.http import HttpResponse
      def page1_view(request):
        html="<h1>这是第1个页面</h1>"
        return HttpResponse(html)

      2

      urls.py中引用views.py中的函数

      3

六、路由配置

  • settings.py'ROOT_URLCONF'指定了主路由配置列表urlpatterns的文件位置

    • \# file:<项目同名文件夹下>/urls.py

      urlpatterns = [
        path('admin/', admin.site.urls),
        path('page/2003/',views.page_2003),
        path('page/2004/',views.page_2004),
        ... # 此处配置主路由
      ]

      1.path

    • path()函数
    • 导入 - from django.urls import path
    • 语法 - path(route,views,name=None)
    • 参数:

      • 1.route:字符串类型,匹配的请求路径
      • 2.views:指定路径所对应的视图处理函数的名称
      • 3.name:为地址起别名,在模板中地址反向解析时使用
    • 练习 - 建立一个小网站

      • 输入网址:http://127.0.0.1:8000,在网页中输出:这是我的首页

        • views.py:
        def page_home(request):
            html = "<h1>这是我的首页</h1>"
            return HttpResponse(html)
        • urls.py:
        path('', views.page_home),

        网页:

        4

    • 输入网址:http://127.0.0.1:8000/page/1,在网页中输出:这是编号为1的网页
    • views.py:

      def page_1(request):
          html = "<h1>这是编号为1的网页</h1>"
          return HttpResponse(html)
    • urls.py:

      path('page/1/', views.page_1),

      网页:

      5

      • 输入网址:http://127.0.0.1:8000/page/2,在网页中输出:这是编号为2的网页
      • views.py:

        def page_2(request):
         html = "<h1>这是编号为2的网页</h1>"
         return HttpResponse(html)
    • urls.py:

      path('page/2/', views.page_2),

      网页:

      6

2.path转换器

  • 语法:<转换器类型:自定义名>
  • 作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参方式传递给视图函数
  • 例子:path('page/\<int:page>',views.xxx)

    转换器类型作用样例
    str匹配除了'/'之外的非空字符串"v1/users/<str:username>"匹配/v1/users/zhangsan
    int匹配0或任何正整数。返回一个int"page/<int:page>"匹配/page/100
    slug匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签"detail/<slug:sl>"匹配/detail/this-is-django
    path匹配非空字段,包括路径分隔符'/'"v1/users/<path:ph>"匹配/v1/goods/a/b/c
  • 练习:小计算器

    • 定义一个路由格式为:

      `http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数`
      
    • 从路由表中提取数据,做相应的操作后返回给浏览器
    • 效果如下:

      输入:http://127.0.0.1:8000/100/add/200

      页面显示结果:300

  • urls.py:

    path('<int:n>/<str:op>/<int:m>', views.cal)
  • views.py:

    def cal(request, n, op, m):
        if op not in ['add', 'sub', 'mul']:
            return HttpResponse('Ur op is wrong!')
    
      result = 0
    
      if op == 'add':
          result = n + m
      elif op == 'sub':
          result = n - m
      elif op == 'mul':
          result = n * m
    
      return HttpResponse('<h1>结果为:%s</h1>' % result)

    7