55、初识Django

Django框架 / 2021-02-13

一、Python三大主流web框架

1.1、Django

优点

大而全,自带功能特别丰富。

缺点

因为功能过多,有时显得过于笨重,有点像杀鸡用牛刀。

1.2、flask

优点

轻量级框架,因此自带功能很少,但第三方插件非常丰富,加起来功能可能比Django还丰富,且越来越像Django;插件这点和vscode非常相似,二者都很轻量,全靠插件丰富血肉。

缺点

过于依赖第三方插件,比如flask更新了插件却没更新,这时候很可能产生兼容性问题等。

1.3、tornado

天生异步非阻塞,支持高并发,快到甚至可以开发游戏服务器。

1.4、简易web框架组成

socket部分,实现客户端与服务端交互。

路由(用户访问的地址后缀名)与视图函数,实现数据展示。

模板语法,实现后端与前端的交互。

Django

Django的socket部分用的是Python标准库提供的wsgiref模块;路由与视图函数部分、模板语法均为自己开发。

flask

flask的socket部分用的是werkzeug模块,其实内部也是引入了wsgiref;路由与视图函数自己开发;模板语法用的是jinja2的,这个模块非常受欢迎,现下很火的fastapi也是用的jinja2.

tornado

全是自己写的,就是这么牛皮,后续学到会再介绍。

二、Django基础

2.1、注意事项

  • 计算机名称最好是英文字母+数字组成,有中文可能会出现问题。
  • 一个pycharm窗口尽量只开一个项目,避免混淆。
  • 项目里面所有文件也尽量不要出现中文,因为这个世界的顶尖技术绝大多数是英文国家的人所开发,为了避免出现各种错误,我们只能使用英文,这是现实。
  • Python解释器尽量使用3.4-3.6之间的版本,如果项目报错,点击最后一个报错信息,去源码中把逗号删掉。

2.2、Django版本

有三个版本,1.X,2.X,3.X,3版本还不足够稳定,使用最多的是1.11这个LTS版本,生产环境也应该追求稳定版而不是最新版。1.11版目前最新的小版本是1.11.29,我们将会使用这个版本来学习Django开发。

2.3、Django安装

命令行安装
pip3 install django == 1.11.29
# 安装完终端键入django-admin,不报错且有信息返回则代表成功
pycharm

pycharm专业版直接支持Django

2.4、Django基本操作

2.4.1、项目相关
创建项目

startproject后面跟项目名称

django-admin startproject test1
启动项目
# 需要先切换到项目对应目录下,默认端口8000
python manage.py runserver
创建应用

startapp后面跟APP名称。项目就跟市政府一样,而APP就相当于市政府中一个个的部门机构。

python manage.py startapp study

创建好APP后一定要记得去配置文件中注册才能生效

# 如下所示,将study加入其中,也可以简写了study
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'study.apps.StudyConfig'
]
启动项目

因为pycharm专业版支持Django开发,因此启动可直接在左上角或右上角的Django项目奠基用绿色的运行图标或者用pycharm的终端输入完整命令

python manage.py runserver
2.4.2、pycharm简单操作

pycharm功能确实很强大,专业版支持直接创建project,在左上角--file--New Project--Django--Create即可;创建完后pycharm会自动创建一个templates文件夹且自动在配置文件中配置对应的路径,命令行创建project是没有这一项的,需要手动创建并配置路径相关的配置。

注意,pycharm新版有一个BUG,'DIRS': [BASE_DIR / 'templates'],这本来的意思是拼接路径,但是系统会把这个斜线当成除号而报错不能运算字符串与字符串,我们自己拼接路径:[os.path.join(BASE_DIR, 'templates')]才能正常启动并识别templates。

  • DEBUG = True,生产环境要改成false,以免产生大量调试信息。
  • ALLOWED_HOSTS = [],白名单
2.4.3、Django响应客户端

需要先在项目文件夹里面的路由urls配置用户访问的路由,然后再去APP的views里面配置视图函数,一定要记得导入对应模块!!!

# 先在views定义视图函数,然后在urls路由里导入views对应函数
from django.conf.urls import url
from django.contrib import admin
from study import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
]
HttpResponse

收到客户端的访问,返回字符串。

# 先在views定义视图函数
def index(request):
    """

    :param request: 用户请求相关的所有数据对象都在这个request里
    :return: 返回一般可以有三种值,HTTPresponse,render,redirect
    """
    return HttpResponse('祝大家新春快乐,身体安康,前途似锦!')

启动项目,在浏览器访问对应的路由index,结果如下所示:

image-20210212113415833

render

返回HTML页面,这也是最常用的。因为上面pycharm自动配置了templates相关路径,因此我们只需要写文件即可。

def index(request):
    return render(request, 'first.html', locals())
redirect
def index(request):
    return redirect('https://blog.sanxi.info')

2.5、静态文件配置

静态文件,可以理解为写死了的文件;比如说JS文件、CSS文件、图片文件、第三方前端框架等等。我们默认将HTML文件放在templates目录下,而将HTML里面渲染用的静态文件存放在static目录下,django默认是不会自动创建static文件夹,需要手动创建,还会对它进一步细分如js css img。

在浏览器键入URL能够访问对应的资源是因为后端提前开设了该资源的接口,也就是路由到视图函数return回数据,因此我们创建好static相关目录后,需要去配置它。

我们在HTML有导入JS、CSS文件,但是在客户端访问页面是会报错的,因为你在服务端导入了对应样式文件,但是客户端没有啊!所以我们需要告诉浏览器去static里面找样式去!

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
# 在settings最下面添加static配置,static_url,类似于进出宫门的令牌,有了这个令牌才有资格进出;而下面的DIRS才是真正的目录。
,告诉django该去这个列表里从上到下依次查找,无则报错;需要注意的是如果存在多个路径,只会使用匹配到的第一个路径,后续不再查找。
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
# 配置完后,我们再去templates下的HTML文件添加样式
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<script src="/static/js/bootstrap.min.js"></script>
静态文件动态解析

如果因为某种不可抗拒因素导致我们不用在STATIC_URL那里不能用'/static/,又或者经常需要改,我们就需要在HTML文件里面去改,有点麻烦,模板语法给我们提供了一种动态解析的方法:

{# 大括号里面直接写路径,无论STATIC_URL改成什么都会自动解析到这里 #}
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'js/bootstrap.min.js' %}">
注意事项

Django项目可能会出现后端代码改了但是前端页面没有变化的情况,提供两个思路:

  • 可能是你在pycharm同一个窗口开了好几个django项目,在跑的其实是第一个django项目。
  • 可能是浏览器缓存问题,右键浏览器:检查-settings-preference-network-disable cache勾上,这样每次打开检查页面去访问都不会使用缓存。

2.6、request对象及其方法

在前期学习Django的时候,记得先去settings的MIDDLEWARE里面,注释掉这行代码django.middleware.csrf.CsrfViewMiddleware

request.method  # 返回请求方式,且为全大写字符串
request.POST  # 获取用户提交的post请求数据,但不包含文件。
<QueryDict: {'username': ['sanxi'], 'passwd': ['123']}>
GET和POST的get、getlist方法一模一样,get只能获取key值对应的列表最后一个元素,而getlist可以获取整个列表;且get请求携带数据量有限,而post则无限制,因为它要接收文件。

世间微尘里 独爱茶酒中