Django初识

初始Django

一、Django介绍
  • Django历史

    Django 是由美国的一个 Web 开发团队编写。它诞生于 2003 年秋天,那时Web团队负责制作和维护本地的几个新闻网站,那些网站(包括 LJWorld.com、Lawrence.com和KUsports.com)不断要求增加功能,而且整个应用要在紧张的周期内快速开发出来,通常只有几天或几小时。因此,只能开发一个节省时间的 Web开发框架,这样他们才能在极短的截止日期之前构建出易于维护的应用。经过一段时间的开发后,那个框架已经足够驱动世界上最大的在线网站了。2005 年夏天,团队决定把框架作为开源软件发布出来。他们在 2005 年 7 月发布了那个框架,将其命名为 Django。

    Django是一个开放源代码的Web应用框架,由Python写成。功能比较齐全。现在市场份额50%左右,其他Web框架还有Flask,Tornado。

django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实现http的通信,底层用纯c,c++写提升效率,ORM框架给干掉,自己编写封装与数据库交互的框 架,因为啥呢,ORM虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询;

flask:轻量级,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验 证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以NoSQL。 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是Flask框架的核心。Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。

Tornado: Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。 得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架

二、Django特性
  • 优点

1、重量级的框架,提供了丰富的功能组件,让开发变得简单,便捷

2、完善的开发文档,提供给了开发人员很好的解决方案

3、开发效率快

  • 缺点

1、开发不够灵活,不够自由,不能够完成高度定制化的开发

2、执行速度慢。

Django的官网:https://docs.djangoproject.com/en/2.2/

三、Django安装

1、django版本号

统一使用2.2.1 版本

2、为什么使用这个版本?

①不使用最新的版本(不稳定)

②选择使用稳定的版本

③LTS 长版本支持

3、Django安装

(1)anaconda虚拟环境操作
conda -V : 查看anaconda 版本

创建虚拟环境
conda create -n 虚拟环境的名字 python=版本号

激活虚拟环境:activate 虚拟环境的名字

退出虚拟环境 :deactivate

查看有哪些虚拟环境:conda env list

(2)安装Django

创建虚拟环境 conda create -n DjangoPath python=3.7

激活虚拟环境 activate DjangoPath

安装Django pip install django==2.2.1

使用国内源)pip install django==2.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

  • 创建项目

    1、创建过程

    (1)首先创建一个目录

    (2)进入目录,打开终端(命令行)

    (3)激活虚拟环境 activate DjangoPath

    (4)创建工程 django-admin startproject Demo(工程名字)

    2、Django项目的启动

    (1)进入Django项目 manage.py 同级目录

    (2)激活虚拟环境

    (3)启动项目

    ①、python manage.py runserver

    ②、python manage.py runserver 9000 修改端口

    ③、python manage.py runserver 0.0.0.0:9000
    所有同一个局域网中的用户都能访问

    0.0.0.0 代表本机的所有ip地址,如果一个服务有多个IP地址(192.168.1.2和10.1.1.12),那么我们如果设置的监听地址是0.0.0.0那么我们无论是通过IP 192.168.1.2还是10.1.1.12 都是可以访问该服务的

    127.0.0.1是回环地址,当我们在服务器搭建了一个Web服务器的时候如果我们监听

    的端口时127.0.0.1:端口号时候,那么这个Web服务器只可以在服务器本地访问了
    ,在别的地方进行访问是不行的

    前提:
    a.将settings.py中的ALLOWED_HOSTS = [’’] 添加 “*”

    b.在同一个局域网中

    3、django原理

    1、127.0.0.1:8000找到服务器

    2、请求的路由是/laowang/

    3、在django代码中找到ROOT_URLCONF,找到总路由urls.py

    4、在urls.py逐个匹配,匹配成功后找到视图函数

    5、显示视图函数的响应内容

  • django路由

    基本格式:

    path(“字符串”,要执行任务的视图)

    re_path(“正则表达式”,要执行任务的视图)

四、正则表达式

正则: 是一种字符串的处理方式,用于字符串匹配的
字符串的匹配分为两种:

1、内容匹配:

例如:Python中的re模块,JS中的匹配

通过要匹配的内容的类型,长度进行匹配的

2、结构匹配:

xpath 获取到内容的某个标签进行匹配

通过获取内容在这个文档中的结构,进行匹配

字符描述
^匹配输入字符串的开始位置
$匹配输入字符串的结尾位置
.匹配除换行符 \n 之外的任何单字符
\d匹配一个数字字符。等价于 [0-9]
\D匹配一个非数字字符。等价于 [ ^0-9 ]
\w匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]
\W匹配任何非单词字符。等价于 [ ^A-Za-z0-9_ ]
[xyz]字符集合 匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’
()标记一个子表达式的开始和结束位置 子表达式可以获取供以后使用
|指明两项之间的一个选择
*匹配前面的子表达式零次或多次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
五、django路由正则匹配
re_path(r'^\w/$', views.zf) # \w 匹配任意一个字母数字下划线
re_path(r'^\w+/$', views.zf)  # + 表示匹配前面的表达式一次或者多次 例如 fengtai
re_path(r'^\d/$', views.blog) , # \d 匹配任意数字
re_path(r'^\d{4}/$', views.blog)  # {4}固定位数
  • 分组匹配

    作用:通过分组匹配将url路径部分内容,传递到视图函数中

    格式:通过()方式, 将匹配到的内容传递给视图函数的形参

  • 分组命名匹配

    作用:和分组匹配作用相同,但是更加直观

    格式:(?P<名称>正则表达式)

六、django模板
  • 模板加载

    1、认识BASE_DIR(项目根目录)

    2、在setting.py中的TEMPLATES 加上 ‘DIRS’:[os.path.join(BASE_DIR,“templates”)]

    3、创建templates目录
    在项目路径下创建一个文件夹一般叫templates,与manage.py同路径下

  • 模板语法

    Django自带模板渲染的规则,分为三种。变量、标签、过滤器

    1、变量

    语法: {{ 变量名 }}

    支持类型: 字符串,整形,列表,字典,元祖

    变量是字典类型,可以以键取值

    变量是有序的序列类型,变量可以通过索引进行取值

    变量是对象,可以调用没有参数的方法

    locals() 会将所有的局部变量作为字典返回

    2、标签
    语法: {% %}

    具有某种语法的逻辑

    (1)if结构的使用

    {% if age > 18 %}
        已经成年
    {% elif age == 18 %}
        正好成年
    {% else %}
        未成年
    {% endif %}
    

    (2)ifequal 的使用

    {% ifequal age 18 %}
        18岁真好
    {% else %}
        不等于18
    {% endifequal %}
    

    (3)for循环

    forloop 是一个Django模板提供的一个变量,用于记录循环的次数,常和if在一起使用

    <table width="400px" border="1">
        <tr>
            <td>编号</td>
            <td>用户名</td>
            <td>年龄</td>
        </tr>
        {% for person in person_list %}
        <tr>
                <td>{{ person.id }}</td>
                <td>{{ person.name }}</td>
                <td>{{ person.age }}</td>
            {% endfor %}
        </tr>
    </table>
    

    (4)for … empty 循环

    如果变量名不存在或者内容为空的时候显示{%empty%}中的内容,否则不执行

    (5)autoescape
    DTL模板中默认已经开启了自动转义,会将那些特殊字符串进行转义,比如会将“<”转义成<会将“>”转移成“>”,使用DTL的自动转义,可以使网站不容易出现XSS漏洞。
    如果变量是可信任的,那么可以使用“autoescape”标签来关掉 自动转义

    {% autoescape on%}
        {{ msg }}
    {% endautoescape %}
    <hr>
    {% autoescape off%}
        {{ msg }}
    {% endautoescape %}
    
  • 过滤器

    3、过滤器

    作用:将视图传的值进行二次处理

    语法: {{ name | 过滤器方法:传值}}

    | 过滤器,将左边语句的值,作为参数传递到后面的语句

    过滤器的方法即 Python定义的方法

    Django提供了很多过滤器的方法,但是为了完成特定的操作内容,需要自定义过滤器

    过滤器作用用法
    upper大写{{ user_name | upper }}
    lower小写{{ user_name | lower }}
    safe执行原本代码{{ js | safe }}

    safe过滤器: Django出于安全的角度考虑,会将视图传递的JS或者HTML的内容进
    行转义,使用safe将指定的内容转为安全的,执行本来的含义

  • 静态文件处理

    静态文件:img,js,css

    方式一:

    1、创建static目录

    2、配置:在setting.py加上

    # 静态文件路由url
    STATIC_URL = '/static/'
    
    # 静态文件位置
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,"static")
    ]
    
    # 图片路径
    <img src="/static/img/a8e2bb2ffe19cdf090fa586ae4462ee3.jpg" alt="">
    

    方式二:

    在html头部写上{% load static %}

    {% load static %}
    
    <img src="{% static 'img/toudianping.jpg' %}" alt="toudianping.jpg">
    
  • 模板继承和包含

    1、继承

    当我们浏览一个网站的时候发现里面的网页大部分都是相同的。这时候我们为了去除代码的冗余,可以使用继承

    (1)、定义父模板,在父模板中使用block

    (2)、定义子模板,继承父模板

    2、包含
    可以将常用的页面内容如导航条,页尾信息等不变的组件可以保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
    {% include ‘navbar.html’ %}

七、谈一下你对uWSGI和 nginx的理解(原理)

在这里插入图片描述

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分

  • WSGI是一种通信协议

  • uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信

  • uWSGI是实现了uwsgi和WSGI两种协议的Web服务器

  • nginx是一个开源的高性能的HTTP服务器和反向代理

  • 作为web服务器,它处理静态文件和索引文件效果非常高

  • 它的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间

  • 稳定性高,配置简洁

  • 强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值