chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

puthon-Django-学习笔记

1、Python 的虚拟环境工具 virtualenv 的安装与使用

前言:

Linux 环境下默认存在 python2.7 环境,但是新版本的 Django 所依赖的环境为 python3 ,python2.7 不能卸载它支持着系统的基础运行程序, 二者环境的并存可能导致python出现奇奇怪怪的问题。

附:

Linux 下 python3 pip3 的安装方法:

Centos
  • 安装EPEL和IUS软件源

    1
    2
    yum install epel-release -y
    yum install https://centos7.iuscommunity.org/ius-release.rpm -y
  • 安装Python3.6

yum install python36u -y

  • 创建python3连接符

ln -s /bin/python3.6 /bin/python3

  • 安装pip3

yum install python36u-pip -y

  • 创建pip3链接符

ln -s /bin/pip3.6 /bin/pip3

Ubuntu

在ubuntu 16.04版本中,系统默认安装 了python 2.7和3.5版本,因为系统本身用到python的程序,删除默认的版本又担心系统有问题,那有没有办法同时在安装和使用python 3.6版本呢?下文将一起安装python 3.6并修改原系统的python3命令以使用新安装的版本。

1、配置软件仓库,因为python 3.6 新版没有发布到ubuntu的正式仓库中,咱们通过第3方仓库来做。在命令行中输入:

sudo add-apt-repository ppa:jonathonf/python-3.6

2、检查系统软件包并安装 python 3.6

1
2
sudo apt-get update
sudo apt-get install python3.6

3、查看python版本信息(现在在你的系统中已经有3个python版本了)
4、通过上图我们看到,新安装的3.6版本需要输入 python3.6才能使用,那能不能配置我只输入python3时就默认使用3.6版本呢,当然可以,执行以下命令

1
2
3
4
5
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2

sudo update-alternatives --config python3

5、最后,咱们确认一下

python3 -V

正题

什么是virtualenv?

virtualenv可以创建独立Python开发环境,比如当前的全局开发环境是python3.6,现在我们有一个项目需要使用django1.3,另一个项目需要使用django1.9,这个时候就可以使用virtualenv创建各自的python开发环境了。

virtualenv的优点

使不同的应用开发环境独立环境升级不影响其他的应用,也不会影响全局的python开发环境它可以防止系统中出现包管理混乱和版本的冲突。

1、基本使用

  • 通过pip安装virtualenv:
    pip install virtualenv
  • 测试安装:
    virtualenv --version
  • 为一个工程项目搭建一个虚拟环境:
    cd my_project
    virtualenv my_project_env
    • 另外,如果存在多个python解释器,可以选择指定一个Python解释器(比如python2.7),没有指定则由系统默认的解释器来搭建:

virtualenv -p /usr/bin/python2.7 my_project_env
将会在当前的目录中创建一个名my_project_env的文件夹,这是一个独立的python运行环境,包含了Python可执行文件, 以及 pip 库的一份拷贝,这样就能安装其他包了,不过已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的Python运行环境来。

  • 要开始使用虚拟环境,其需要被激活:
    source my_project_env/bin/activate
  • 停用虚拟环境:
    deactivate
  • 停用后将回到系统默认的Python解释器

virtualenv 设置好新的虚拟环境之后,打开 Windows 资源管理器,看一下 virtualenv 为我们创建了什么。在家目录中,会看到一个名为 \env_mysite 的文件夹(或者为虚拟环境起的其他名称)。打开那个文件夹,会看到下述结构:
\Include
\Lib
\Scripts
\src
示例图
virtualenv 创建了一个完整的 Python 安装,它与其他软件是隔离开的,因此开发项目时不会影响系统中的其
他软件。

Django admin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Type 'django-admin help <subcommand>' for help on a specific subcommand.

Available subcommands:

[django]
check :校验项目完整性
compilemessages
createcachetable
dbshell
diffsettings
dumpdata : 把数据库数据导出到文件
flush
inspectdb
loaddata : 把文件数据导入到数据库
makemessages
makemigrations:创建模型变更的迁移文件
migrate :执行上一个命令创建的迁移文件
runserver : 运行 django 项目
sendtestemail
shell : 进入 Django 项目的 python shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp : 启用一个 Django 应用
startproject : 启动一个 django
test : 跑一些单元测试用例的
testserver
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call sett
ings.configure() before accessing settings.).

我的第一个 Django 项目:

  • 1、运行虚拟环境
    env_mysite\scripts\activate
  • 2、安装 Django
    pip install django==1.11.7
  • 3、打开 django-admin 所在目录
    cd C:\Users\Lenovo\env_mysite\Scripts
  • 4、创建属于你的第一个 Django 项目
    django-admin startproject mysite

    startproject 为我们创建的文件介绍

    mysite/
    manage.py
    mysite/
    init.py
    settings.py
    urls.py
    wsgi.py
    startproject1
    startproject2

  • 外层的 mysite/ 根目录是项目的容器。这个目录的名称对 Django 没有什么作用,你可以根据喜好重命名。

  • manage.py 是一个命令行实用脚本,可以通过不同的方式与 Django 项目交互。这个文件的详细说明参见 Django Project 网站。
  • 内部的 mysite/ 目录是项目的 Python 包。导入这里面的内容时要使用目录的名称(如 mysite.urls)。
  • mysite/init.py 是一个空文件,目的是让 Python 把这个目录识别为 Python 包。(如果你刚接触Python,关于包的说明请阅读 Python 官方文档。)
  • mysite/settings.py 是 Django 项目的设置/配置。
  • mysite/urls.py 是 Django 项目的 URL 声明,即 Django 驱动的网站的“目录”。
  • mysite/wsgi.py 是兼容 WSGI 的 Web 服务器的入口点,用于伺服项目。

编写视图以及映射

视图

from django.http import HttpResponse
def hello(request):
    return HttpResponse("Hello world")
  • 首先,从 django.http 模块中导入 HttpResponse 类。导入这个类是因为后面的代码要使用。
  • 然后,定义一个名为 hello 的函数,这是视图函数。视图函数至少有一个参数,按约定,名为 request。这是一个对象,包含触发这个视图的 Web 请求的信息,是django.http.HttpRequest 类的实例。
    映射
    
    from django.conf.urls import include, url
    from django.contrib import admin
    from app.views import hello
    urlpatterns = [
      url(r'^admin/', include(admin.site.urls)),
      url(r'^hello/$', hello),
    ]
    
  • 第一行从 django.conf.urls 模块中导入两个函数:include,用于导入另一个 URL 配置模块;url,使用正则表达式模式匹配浏览器中的 URL,把它映射到 Django 项目中的某个模块上。
  • 第二行从 django.contrib 模块中导入 admin 函数。这个函数传给 include 函数,加载 Django 管理后台的 URL。
  • 第三行是 urlpatterns,即 url() 实例列表。
    根目录映射
    准备为网站根地址实现视图时,使用的 URL 模式是 ˆ$,即匹配空字符串。

    from django.conf.urls import include, url
    from django.contrib import admin
    from app.views import hello, current_datetime
    urlpatterns = [
    url(r’^admin/‘, include(admin.site.urls)),
    url(r’^hello/$’, hello),
    url(r’^time/$’, current_datetime),
    url(r’^$’, hello),
    ]

Django 处理请求的过程
  1. 请求 /hello/。
  2. Django 查看 ROOT_URLCONF 设置,找到根 URL 配置。
  3. Django 比较 URL 配置中的各个 URL 模式,找到与 /hello/ 匹配的那个。
  4. 如果找到匹配的模式,调用对应的视图函数。
  5. 视图函数返回一个 HttpResponse 对象。
  6. Django 把 HttpResponse 对象转换成正确的 HTTP 响应,得到网页。

    动态URL
    
    def hours_ahead(request, offset):
     try:
         offset = int(offset)
     except ValueError:
         raise Http404()
     dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
     html = "In %s hour(s), it will be %s." % (offset, dt)
     return HttpResponse(html)
    
    url(r'^time/plus/(\d{1,2})/$', hours_ahead),
    
  • request 是一个 HttpRequest 对象,这与 hello 和 current_datetime 两个视图一样。我要再次强调,每个视图的第一个参数都是 HttpRequest 对象。
  • offset 是 URL 模式中那对圆括号捕获的字符串。如果请求的 URL 是 /time/plus/3/,那么偏移量是字符串 ‘3’;如果请求的 URL 是 /time/plus/21/,那么偏移量是字符串 ‘21’。注意,捕获的值始终是Unicode 对象,而不是整数,即便捕获的字符串中只有数字(如 ‘21’)也不是。

模型层

模型层是什么

位于 Django 视图层和数据库之间

python 对象和数据库表之间转换

为什么需要模型层

屏蔽不同数数据库之间的差异

开发者更加专注于业务逻辑的开发

提供很多便捷的工具帮助开发

模型层配置

1
2
3
4
5
6
7
8
9

setting:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

Django shell

为什么使用 Django shell

临时性操作使用 Django Shell 更加方便

小范围 Debug 更简单,不需要运行整个项目来测试

Django shell 的使用

python manage.py shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [1]: from app.models import Article

In [2]: a = Article()

In [3]: a.title = 'Test Django Shell'

In [4]: a.brief_content = 'Text Django Shell, New Article, main content.'

In [5]: print(a)
Article object (None)

In [6]: a.save()

In [7]: articles = Article.objects.all()

In [12]: article = articles[0]

In [13]: print(article.title)
Test Django Shell

Django Admin 模块

Django Admin 模块是什么

自带的标配后台管理工具

读取定义的模型元数据,提供强大的管理使用界面

为什么需要 Django Admin 模块

简化 Django shell 的操作步骤

管理页面时基础设施中重要的部分

认证用户、显示管理模型、校验输入模型等功能类似

Django Admin 模块的使用

创建管理员用户

登录页面进行管理

差缺补漏:_ str _ (self)

在python中方法名如果是xxxx()的,那么就有特殊的功能,因此叫做“魔法”方法
当使用print输出对象的时候,只要自己定义了str(self)方法,那么就会打印从在这个方法中return的数据
str方法需要返回一个字符串,当做这个对象的描写

新增超级管理员

python manage.py createsuperuser

设计数据返回函数

Django 视图与模板

使用 Bootstrap 实现静态网站页面
页面布局设计

网站首页:

文章详情页设计:

Bootstrap以及Bootstrap的栅格系统

来自美国Twitter的前端框架
提供非常多的控件并附带源码

实现静态页面
初识 Django 的模板系统
  • 模板系统简介:

视图文件不适合编码 HTML
页面设计改变需要修改python代码
页面逻辑和网页视图应该分开设计
模板系统的变现形式是文本
分离文档的表现形式和表现内容
模板系统定义了特哟的标签占位符

  • 基本语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
◆变量标签:{{变量}
<html><body>{{now}}</body></html>

◆for循环标签:{%for xin list%),{%endfor%}

<ul>
{% for item in list %}
<li>{{item }}</li>
{% endfor%}
</ul>

◆if-else分支标签:{%if%},{%else%),{%endif%}

{% if true }
<p>it is a true part.</p>
{% else%}
<p>it is a false part.</p>
{% endif%}
使用模板那系统渲染网站页面
实现文章详情页面跳转
设计文章详情页的URL
1
2
3
4
5
/blog/detail=>不能指定某一篇博客
·/blog/detail/1=>博客唯一ID为1的文章
·/blog/detail/2=>博客唯一ID为2的文章
·/blog/detail/3=>博客唯一ID为3的文章
·/blog/detail/..
实现首页的跳转

就是完善视图函数

实现上下篇文章跳转

文章下面添加两个按钮 上一篇 下一篇

实现分页功能
喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道