【实战学习(三)】开源项目学习之Django框架简介以及启动

文章目录



涉及开源项目(dailyfresh-B2C)的部署架构如下:
部署架构



1)什么是Django?

Django是用python开发的一个免费开源的Web框架,提供了许多网站后台开发常用到的模块,使开发者能够专注于业务部分。

由于Python语言的跨平台性,所以Django同样支持Windows、Linux和Mac系统。

  • Web框架的概念:

它是一套组件,提供通用的设计模式,能够最大程度地降低开发 Web 站点开发的难度。
- 目前最流行的Python Web框架除了Django以外,还有可以快速建站的Flask和支持高并发处理的Tornado。

  • Django的版本发布

  • 功能版:版本号定义为 A.B、A.B+1 等,大概每 8 个月发布一次
  • 补丁版:主要用来修复 bug 或者安全问题,版本号为 A.B.C 或者 A.B.C+1
  • LTS版本(长期支持版本):官方会长期提供支持和安全更新,时长至少三年,所以我们建议安装和使用 LTS 版本

一些 Django 版本会被指定为 LTS,例如 1.11 LTS。值得注意的是,Django 最后一个支持 Python 2.7 的版本是 1.11 LTS,最新的 LTS 版本是 2.2 LTS。


  • Django框架的特点

相对于 Python 的其他 Web 框架,Django 的功能是最完整的。Django 定义了服务发布、路由映射、模板编程、数据处理的一整套功能。这也意味着 Django 模块之间紧密耦合。

主要特点:

  • 完善的文档

  • 集成 ORM 组件:

    Django 的 Model 层自带数据库 ORM 组件,为操作不同类型的数据库提供了统一的方式。
  • URL 映射技术:

    Django 使用正则表达式管理URL映射,因此给开发者带来了极高的灵活性。
  • 后台管理系统:

    开发者只需通过简单的几行配置和代码就可以实现完整的后台数据管理Web控制台。
  • 错误信息提示:

    在开发调试过程中如果出现运行异常,Django 可以提供非常完整的错误信息帮助开发者定位问题。

2)Django的设计模式,即MTV

1、Web设计模式的经典之作–MVC

在 Web 开发领域还有一个非常著名的设计模式——MVC,它是 Web 设计模式的经典之作,MTV 模式也是在它的基础上衍生而来。

MVC 是 Model-View-Controller 的缩写:

  • Modle:

    代表数据存储层,是对数据表的定义和数据的增删改查。
  • View:

    代表视图层,是系统前端显示部分,它负责显示什么和如何进行显示。
  • Controller:

    代表控制层,负责根据从 View 层输入的指令来检索 Model 层的数据,并在该层编写代码产生结果并输出。

MVC设计模式示意图

MVC设计模式的请求和响应过程:

1、用户通过浏览器向服务器发起request请求,Controller层接受请求后,同时向Model层和View发送指令;

2、Model层根据指令与数据库交互并选择相应业务数据,然后将数据发送给Controller层;

3、View 层接收到 Controller 的指令后,加载用户请求的页面,并将此页面发送给 Controller 层;

4、Controller 层接收到 Model 层和 View 层的数据后,将它们组织成响应格式发送给浏览器,浏览器通过解析后把页面展示出来。


MVC 的 3 层之间紧密相连,但又相互独立,每一层的修改都不会影响其它层,每一层都提供了各自独立的接口供其它层调用,MVC 的设计模式降低了代码之间的耦合性(即关联性),增加了模块的可重用性,这就是 MVC 的设计模式。

2、MTV设计模式

Django 借鉴了经典的 MVC 模式,它也将交互的过程分为了 3 个层次,也就是 MTV 设计模式:

  • Model:

    数据存储层,处理所有数据相关的业务,和数据库进行交互,并提供数据的增删改查。
  • Template:

    模板层(也叫表现层)具体来处理页面的显示。可以简单地把Template理解成,它是一个 HTML 页面 ,HTML 页面的渲染在视图层完成。
  • View:

    业务逻辑层,处理具体的业务逻辑,它的作用是连通Model 层和 Template。

Django MTV设计模式示意图

MTV设计模式的请求和响应过程:

1、用户通过浏览器对服务器发起 request 请求,服务器接收请求后,通过 View 的业务逻辑层进行分析,同时向 Model 层和 Template 层发送指令;

2、Mole 层与数据库进行交互,将数据返回给 View 层;

3、Template 层接收到指令后,调用相应的模板,并返回给 View 层;

4、View 层接收到模板与数据后,首先对模板进行渲染(即将相应的数据赋值给模板),然后组织成响应格式返回给浏览器,浏览器进行解析后并最终呈现给用户。

可以看出,MTV 是 MVC 的一种细化,将原来 MVC 中的 V 层拿出来进行分离,视图的显示与如何显示交给 Template 层,而 View 层更专注于实现业务逻辑。

其实在 Django 是有 Controller 层的,只不过它由框架本身来实现,所以我们不用关心它。Django 更关注于M、T 和 V。


3)搭建Django开发环境

搭建开发环境不仅是个繁琐的过程,而且很容易出错,搭建 Django 开发环境主要分为以下 5 个步骤,将依次展开:

  • 安装 Python 解释器
  • 安装 MySQL 数据库
  • 安装 Python 包管理器 pip
  • 安装 Pycharm IDE
  • 安装 Django

1、安装Python解释器

Django 是一款完全基于 Python 的 Web 开发框架,所以安装 Python 解释器是毋庸置疑的。本开源项目是以 Django==2.1.7版本为requirements,它支持 Python3.5、3.6 以及 3.7。

如果使用的是 Linux 或 Mac 操作系统,电脑中已经安装了 Python。因为这两种操作系统的部分功能是使用 Python 语言实现的,所以在它们出厂的时候就对 Python 进行内置安装,可以使用如下命令检查 Python 版本:

he@he-ThinkPad-X200:~$ python --version

Command 'python' not found, did you mean:

  command 'python3' from deb python3
  command 'python' from deb python-is-python3

he@he-ThinkPad-X200:~$ python3 --version
Python 3.8.5
  • Django和Python兼容对照表

    Django版本Python版本
    1.112.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17)
    2.03.4, 3.5, 3.6, 3.7
    2.1, 2.23.5, 3.6, 3.7
    3.03.6, 3.7, 3.8

2、安装MySQL数据库

为了达到数据存储的目的,需要对数据库进行安装,Django 对关系型数据库有非常好的支持,虽然它自带一个轻量级的 SQLite 数据库,但为了切合 Django 的实际应用场景,一般会选择 MySQL 这样的企业级应用数据库。

3、安装Python包管理器

pip 包管理器是一种自动安装、升级、配置和删除包的软件,无需自己动手下载、安装和维护软件,除此之外包管理器还帮助解决以下几个问题:

  • 包对环境的的依赖问题;
  • 包之间存在冲突的问题;
  • 包的系统路径指定和维护问题。

这些繁琐的工作都交给 pip 包管理器去处理。

Python3.4 及以上本版本,均对 pip 做了内置安装,所以在安装 Python 时直接安装 3.7 版本即可,省去不必要的麻烦。

  • pip最常用的命令:

    查看版本:pip --version
    安装:pip install 包名
    升级:pip install -U 包名
    卸载:pip uninstall 包名
    列出已经安装的包:pip list
    

4、安装Pycharm IDE

PyCharm 是一种 Python IDE,它是一个可跨平台的开发工具,被认为是最好用的 Python IDE 之一,它带有一整套在使用 Python 语言开发时提高效率的工具,比如调试、语法高亮、Project 管理、代码跳转、智能提示、自动完成等。此外,该 IDE 对 Django 框架下的专业 Web 开发提供了良好的支持。

具体可参考本栏的《【实战学习(二)】开源项目学习之开发环境搭建》(https://blog.csdn.net/m0_37621024/article/details/115834177)。


4)启动一个开源的Django项目

同样以https://github.com/Ylisen/dailyfresh-B2C 的项目为例。

1、准备工作

从网络上下载好django项目后,在本地用pycharm导入后,并不能运行。此时需要添加库和创建数据库。

2、启动项目,安装所需的库

2.1 启动项目

在 CMD 命令行工具中,执行cd命令进入到存放有manage.py 的目录下。启动项目的命令如下:

python manage.py runserver

runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的 WSGI Server 运行,主要在测试和开发中使用。

如果缺少一些库,命令行会提示需要安装XXX库。打开cmd,用pip命令安装即可。

  • 比如提示缺少:ModuleNotFoundError: No module named ‘tinymce’。
    则需要安装django-tinymce==2.8.0。

  • *报错之No module named ‘haystack.backends.whoosh_cn_backend’
    • 原因:python的django框架在2.0版本以上已经不存在whoosh_cn_backend。
    • 解决方案:找到settings.py,将“haystack.backends.whoosh_cn_backend.” 改为 “haystack.backends.whoosh_backend.”。参考自(https://blog.csdn.net/weixin_43860800/article/details/85163068)

  • *报错之No module named ‘alipay’
    • 原因:alipay 是一款轻量的支付宝组件。详情可见(https://www.oschina.net/p/alipay?hmsr=aladdin1e1)
    • 解决方案:先尝试了pip install aiohttp,还是不行。然后尝试pip install python_alipay_sdk,成功。

  • *报错之django.db.utils.OperationalError: (2003, “Can’t connect to MySQL server on ‘192.168.229.130’ (timed out)”)
    • 原因:与mysql没有连接上。
    • 解决方案:修改数据库的连接,即修改settings.py中的DATABASES中的参数,并新建数据库。如果还是不行,检查防火墙(详情可参考https://blog.csdn.net/wsyzxss/article/details/90750477)。

  • *报错之django.db.utils.InternalError: (1049, “Unknown database ‘dailyfresh’”)
    • 原因:Unknown database ‘xxxxx’:这个错误一定是数据库不存在或者是名称写错了导致的。

    • 解决方案:cmd打开window控制台,登录mysql

      C:\Users\Facek>mysql -uroot -p
      Enter password: ****
      
      mysql> show variables like 'datadir';  # 查看mysql的路径
      +---------------+---------------------------------------------+
      | Variable_name | Value                                       |
      +---------------+---------------------------------------------+
      | datadir       | C:\ProgramData\MySQL\MySQL Server 5.5\Data\ |
      +---------------+---------------------------------------------+
      1 row in set (0.02 sec)
      
      mysql> create database dailyfresh;  # 新建数据库
      Query OK, 1 row affected (0.02 sec)
      
      mysql> show databases  # 查看是否有对应的库
          -> ;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | books              |
      | dailyfresh         |
      | girls              |
      | myemployees        |
      | mysql              |
      | performance_schema |
      | student            |
      | students           |
      | test               |
      +--------------------+
      10 rows in set (0.01 sec)
      

  • 扩展之manage.py文件

    manage.py 文件是管理 Django 项目的重要命令行工具,它主要用于启动项目、创建应用和完成数据库的迁移等。必须和 manage.py 文件处于同一个路径下才可以执行启动命令。

  • 扩展之settings.py 文件

    settings.py 文件是 Django 项目的重要配置文件。项目启动时,settings.py 配置文件会被自动调用,而它定义的一些全局为 Django 运行提供参数,在此配置文件中也可以自定义一些变量,用于全局作用域的数据传递。

  • 扩展之django-tinymce

    TinyMCE是一个轻量级的,基于浏览器的,所见即所得的编辑器,支持目前流行的各种浏览器,由JavaScript写成。功能配置灵活简单(两行代码就可以将编辑器嵌入网页中),支持AJAX。另一特点是加载速度非常快,如果你的服务器采用的脚本语言是 PHP,那还可以进一步优化。最重要的是,TinyMCE是一个根据LGPL license发布的自由软件,可以把它用于商业应用。

  • 扩展之django-haystack

    Haystack 是 Django 框架的搜索扩展模块。Haystack 提供统一的 API 允许你使用不同的搜索后端,包括 Solr, Elasticsearch, Whoosh, Xapian 等等。

  • 扩展之Whoosh

    Whoosh 是纯Python实现的全文搜索引擎,通过Whoosh可以很方便的给文档加上全文索引功能。
    全文搜索简单讲分为两块,一块是分词,一块是搜索。全文搜索却将内容切成一个个Token,切分成Token后做反向索引(inverted indexing),这样就可以通过关键字很快查询到结果。

  • 扩展之Celery

    Celery是Python开发的分布式任务调度模块。Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,Celery支持的消息服务有RabbitMQ、Redis甚至是数据库,当然Redis应该是最佳选择。Celery可以处理大量消息,同时为操作提供维护该系统所需的工具。这是一个任务队列,着重于实时处理,同时还支持任务调度。

  • 扩展之itsdangerous

    使用itsdangerous可以实现对数据进行加密签名并将其移交给其他人,当取回数据时,可以轻松确保没有人篡改数据。只要保管好密钥,并且密钥足够复杂,其他人就无法修改内容。
    itsdangerous内部默认使用了HMAC和SHA1来签名,基于 Django 签名模块。它也支持JSON Web 签名 (JWS)。这个库采用BSD协议,由Armin Ronacher编写,而大部分设计与实现的版权归Simon Willison和其他的把这个库变为现实的Django爱好者们。

  • 扩展之django-redis

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set–有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

  • 扩展之Pillow

    Pillow 是 PIL(Python Imaging Library , 是Python2.x版本的第三方图像处理库)的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。
    Pillow 为了解决 PIL 的两个问题:

    • 不兼容 setuptools
    • 报告的问题太多,而更新太慢

    注意 : Pillow 不能和 PIL 在一个环境里共存,所以如果安装过 PIL,请先卸载 PIL。


2.2 启动成功

执行完命令后,如下所示表示启动成功:

C:\Users\Facek\Documents\github-learning\dailyfresh-B2C\dailyfresh>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 20 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, goods, order, sessions, user.  # 是 Django 给的警告信息
Run 'python manage.py migrate' to apply them.
April 22, 2021 - 00:31:05
Django version 2.1.7, using settings 'dailyfresh.settings'  # 版本号2.1.7
Starting development server at http://127.0.0.1:8000/  # 启动地址
Quit the server with CTRL-BREAK.

首先 Django 告诉我们如何访问项目,通过 http://127.0.0.1:8000 访问创建好的项目,8000 是 Django 的默认端口号。最后如若想退出运行状态,可以通过 CTRL+C 来终止。


2.3 访问项目

在浏览器地址栏输入 http://127.0.0.1:8000 进行访问,结果出现下图:
在这里插入图片描述

  • 404 not found
    “404 NOT FOUND, 404错误 ”(或“ 找不到页面 ”) – 是服务器无法找到用户请求的文档时发生的标准HTTP状态代码 。
    • 可能原因:网页已从网站上删除 / 用户输入的URL地址不正确 / 页面已移动,重定向配置不正确 / 服务器出现故障

    • 分析原因:查看dailyfresh文件下的urls.py,能找到为路径为空的path,但页面又提示空路径不匹配任何一个。再看cmd运行窗口:

      [22/Apr/2021 00:40:02] "GET / HTTP/1.1" 404 3027
      Not Found: /favicon.ico
      
    • 解决方法:找一个图片格式为ico,命名成: favicon.ico,拷贝到django下的./contrib/admin/static/admin/img/,操作完成后重新执行python manage.py runserver 0.0.0.0:8000,打开浏览器,(参考http://www.voidcn.com/article/p-suwghcua-bqm.html),依然不行,但命令行提示的是:

      Not Found: /
      

先绕过这个问题,根据提示,改变访问的文档:

在这里插入图片描述
可以看到CMD命令行也发生变化:

C:\Users\Facek\Documents\github-learning\dailyfresh-B2C\dailyfresh>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 20 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, goods, order, sessions, user.
Run 'python manage.py migrate' to apply them.
April 22, 2021 - 00:31:05
Django version 2.1.7, using settings 'dailyfresh.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Not Found: /
[22/Apr/2021 00:40:02] "GET / HTTP/1.1" 404 3027
Not Found: /favicon.ico
[22/Apr/2021 00:40:02] "GET /favicon.ico HTTP/1.1" 404 3078
[22/Apr/2021 00:42:53] "GET /admin/ HTTP/1.1" 302 0
[22/Apr/2021 00:42:56] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1821
[22/Apr/2021 00:42:56] "GET /static/admin/css/base.css HTTP/1.1" 200 16225
[22/Apr/2021 00:42:56] "GET /static/admin/css/login.css HTTP/1.1" 200 1203
[22/Apr/2021 00:42:56] "GET /static/admin/css/responsive.css HTTP/1.1" 200 17976
[22/Apr/2021 00:42:56] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[22/Apr/2021 00:42:56] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 81348
[22/Apr/2021 00:42:56] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 80304


3、添加库和创建数据库

作为应用(下面统称 app)通常都会需要使用数据表来完成状态或数据的保存,Django 自带的 app 也不例外。如果不同步这些应用的数据表到数据库中,而是直接启动项目,在 CMD 命令行就会打印警告信息,并且告知如何解决这个警告信息方法。如下图:
在这里插入图片描述
Django 的警告信息,告诉我们安装在 INSTALLED_APPS 列表中应用如 admin、auth等需要进行数据库迁移。而且它还告诉我们如何进行迁移,就是命令:python manage.py migrate。

  • migrate:就是把 Django 默认自带应用的数据表迁移到我们自己创建的数据库里。

  • 扩展之migrate:

    migrate是 manage.py 的子命令,它主要用来将应用的数据表同步到数据库中。执行后,它会检查 INSTALLED_APPS 里配置的应用列表,依次为每个应用创建所需要的数据表。

  • 扩展之INSTALLED_APPS参数:

    settings.py 配置文件中,这个参数是指当前项目中用来安装的应用(APP)的列表,Django 把默认自带的应用放在这个列表里,比如 Admin 后台应用、Auth 用户管理系统等。

    可以根据自己的项目需求对其进行增加或删除,比如公司要单独开发一个后台管理系统,就可以把第一项 admin 注释掉。开发时自己编写的应用都必须在这个变量表中进行注册才能生效。所以这个列表需要经常的改动。

可以根据自己的需要来决定使用哪个应用,如果项目本身用不到,可以将其在列表注释掉,那么migrate就不会执行它了。在执行此命令之前,数据库应该处于开启状态而且 settings.py 文件已经做了相应的配置。

  • 执行migrate报错之"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘(6) NOT NULL)’ at line 1"

    • 报错信息:
      pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1")
      
    • 环境信息:Python 3.7+Django 2.1.7+MySQL 5.5.15

    • 原因:

      Django 2.1.x 以后要求MySQL 5.6或更高。它通过将DateTimeField映射到datetime(6)打破了兼容性,根本原因就是不兼容。

    • 解决方法:

      1、安装更高版本的Mysql数据库。(可参考:https://www.cnblogs.com/muxisc/p/11916968.html,以及无法启动的解决方法:https://blog.csdn.net/qq_37915248/article/details/82631398)
      2、在settings.py文件最顶部增加如下代码:

      from django.db.backends.mysql.base import DatabaseWrapper
      DatabaseWrapper.data_types['DateTimeField'] = 'datetime' # fix for MySQL 5.5
      
      • 参考自(https://blog.csdn.net/jiatong151/article/details/102822735)

3.1 执行python manage.py migrate成功:

C:\Users\Facek\Documents\github-learning\dailyfresh-B2C\dailyfresh>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, goods, order, sessions, user
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying user.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying goods.0001_initial... OK
  Applying order.0001_initial... OK
  Applying order.0002_auto_20190302_1646... OK
  Applying order.0003_auto_20190319_1651... OK
  Applying order.0004_auto_20210422_2115... OK
  Applying sessions.0001_initial... OK

3.2 查看生成的数据表

进入MySQL命令界面(在cmd中输入mysql -uroot -p),然后输入:

mysql> use dailyfresh;
Database changed
mysql> show tables;
+--------------------------+
| Tables_in_dailyfresh     |
+--------------------------+
| auth_group               |
| auth_group_permissions   |
| auth_permission          |
| df_address               |
| df_goods                 |
| df_goods_image           |
| df_goods_sku             |
| df_goods_type            |
| df_index_banner          |
| df_index_promotion       |
| df_index_type_goods      |
| df_order_goods           |
| df_order_info            |
| df_user                  |
| df_user_groups           |
| df_user_user_permissions |
| django_admin_log         |
| django_content_type      |
| django_migrations        |
| django_session           |
+--------------------------+
20 rows in set (0.00 sec)

即完成了数据库的迁移。

3.3 migrate与makemigrations命令

Django 对于数据库的迁移工作通过两个命令来实现,一个就是上面的 migrate 命令,另个命令如下:

python manage.py makemigrations

makemigrations 命令会检测应用目录下是否存在 migrations 目录,如果没有则进行创建。首先,会根据应用的表结构定义生成一个 0001_inital.py 文件,里面定义了数据表的结构。

3.3.1 makegrations生成数据库迁移文件

当数据表更改后,会首先执行 makemigrations 命令,然后 Django 会重新生成一个新的数据库迁移文件用来记录表结构之间的差异,命名规则是对上一个迁移文件的序列号加1,如 0002_xxx、0003_xxx。

3.3.2 migrate执行数据库迁移命令

之后,再次执行 migrate 命令让新的迁移文件生效并同步回数据库,从而完成表结构定义的修改。对于 Django 内置的应用,数据库迁移文件已经生成好了,所以直接使用 migrate 命令即可。

3.3.3 完成数据库迁移总结

每一次数据表更改后,都需要执行下面的两个命令,它们的执行顺序如下所示:

python manage.py makemigrations
python manag.py migrate

为了保证已经完成的迁移工作不会重复的执行,Django 会把每一次数据库迁移记录到 django_migrations 表中,每一次执行 migrate 命令前都会比较迁移文件是否已经记录在表中了,只有没出现过的才会执行。若想查看当前项目的第一次 migrate 生成的迁移记录,可以在 MySQL 命令行界面使用如下命令查看 :

mysql> select * from django_migrations;
+----+--------------+------------------------------------------+----------------------------+
| id | app          | name                                     | applied                    |
+----+--------------+------------------------------------------+----------------------------+
|  1 | contenttypes | 0001_initial                             | 2021-04-22 15:19:27.806805 |
|  2 | contenttypes | 0002_remove_content_type_name            | 2021-04-22 15:19:27.956546 |
|  3 | auth         | 0001_initial                             | 2021-04-22 15:19:28.364501 |
|  4 | auth         | 0002_alter_permission_name_max_length    | 2021-04-22 15:19:28.440720 |
|  5 | auth         | 0003_alter_user_email_max_length         | 2021-04-22 15:19:28.449386 |
|  6 | auth         | 0004_alter_user_username_opts            | 2021-04-22 15:19:28.457712 |
|  7 | auth         | 0005_alter_user_last_login_null          | 2021-04-22 15:19:28.465054 |
|  8 | auth         | 0006_require_contenttypes_0002           | 2021-04-22 15:19:28.469725 |
|  9 | auth         | 0007_alter_validators_add_error_messages | 2021-04-22 15:19:28.477618 |
| 10 | auth         | 0008_alter_user_username_max_length      | 2021-04-22 15:19:28.486424 |
| 11 | auth         | 0009_alter_user_last_name_max_length     | 2021-04-22 15:19:28.493436 |
| 12 | user         | 0001_initial                             | 2021-04-22 15:19:29.094893 |
| 13 | admin        | 0001_initial                             | 2021-04-22 15:19:29.290804 |
| 14 | admin        | 0002_logentry_remove_auto_add            | 2021-04-22 15:19:29.300963 |
| 15 | admin        | 0003_logentry_add_action_flag_choices    | 2021-04-22 15:19:29.311172 |
| 16 | goods        | 0001_initial                             | 2021-04-22 15:19:30.592344 |
| 17 | order        | 0001_initial                             | 2021-04-22 15:19:30.685709 |
| 18 | order        | 0002_auto_20190302_1646                  | 2021-04-22 15:19:31.248654 |
| 19 | order        | 0003_auto_20190319_1651                  | 2021-04-22 15:19:31.260626 |
| 20 | order        | 0004_auto_20210422_2115                  | 2021-04-22 15:19:31.299702 |
| 21 | sessions     | 0001_initial                             | 2021-04-22 15:19:31.364548 |
+----+--------------+------------------------------------------+----------------------------+
21 rows in set (0.00 sec)

5)在ubuntu中启动一个开源的Django项目

大部分和前面windows所述的类似。以下主要描述不同的地方。

5.1 遇到的问题之Access denied for user root@localhost

解决方法:需要修改默认的密码。

he@he-ThinkPad-X200:~$ sudo cat /etc/mysql/debian.cnf  # 获取password
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = TdayUCPp8aYH7Hat
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = TdayUCPp8aYH7Hat  # 记下该密码
socket   = /var/run/mysqld/mysqld.sock
he@he-ThinkPad-X200:~$ mysql -u debian-sys-maint -p  # 用默认user登录
Enter password:   # 这里输入刚刚记下的密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.23-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql;
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'root';  # 修改密码为root
Query OK, 0 rows affected (0.14 sec)

mysql> flush privileges;  # 刷新权限
Query OK, 0 rows affected (0.07 sec)

mysql> exit
Bye
he@he-ThinkPad-X200:~$ sudo service mysql restart  # 重新启动mysql
he@he-ThinkPad-X200:~$ 

注意

  • 使用MySQL8版本以前的命令修改密码:set password=password(‘新密码’);
  • 但在在MySQL8新版中修改密码的命令给严格限制了,应该使用:alter user’root’@‘localhost’ identified with mysql_native_password by ‘new_password’ ; 否则会报“You have an error in your SQL syntax”

5.2 遇到的问题之The user specified as a definer (‘mysql.infoschema’@‘localhost’) does not exist

在mysql中输入show databases;时出现的。应该是mysql 8.0以上可能出现的问题(mysql换了加密算法)。

解决方法:

  • 查看错误日志:tail -f /var/log/mysql/error.log

  • 再次执行:/usr/sbin/mysqld --upgrade=NONE

  • 发现: Found invalid password for user: ‘mysql.infoschema@localhost’; Ignoring user

  • 进入mysql,输入:

    mysql> use mysql;
    Database changed
    mysql> select Host,user,authentication_string,plugin from user;
    +-----------+------------------+------------------------------------------------------------------------+-----------------------+
    | Host      | user             | authentication_string                                                  | plugin                |
    +-----------+------------------+------------------------------------------------------------------------+-----------------------+
    | localhost | debian-sys-maint | $A$005$@M}Yap!zf{t.yFhD.VabuG7U.5z3OZDFy7JsmiQTzgUxUR.ogUqv4ER2 | mysql_native_password |
    | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | mysql_native_password |
    | localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | mysql_native_password |
    | localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | mysql_native_password |
    | localhost | root             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B                              | mysql_native_password |
    +-----------+------------------+------------------------------------------------------------------------+-----------------------+
    5 rows in set (0.00 sec)
     # 发现在初始化root用户的时候,把所有用户的plugin都换成了mysql5.7的插件“mysql_native_password”,而最新的mysql8.0的密码插件是caching_sha2_password
    
  • 更新两条数据的plugin:

    mysql> update user set plugin = 'caching_sha2_password' where user='mysql.sys' or user='mysql.infoschema';
    Query OK, 2 rows affected (0.08 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    
    mysql> exit
    
    
  • 重启mysql:service mysql restart



每日继续补充中…

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值