【Python】从0开始的Django基础

unit01

一、Django基础

1.1 什么是Django?

Django是一个基于Python语言的、开源的、重量级的WEB开发框架。

Django适用于开发各类WEB应用程序,包括但不限于电商网站、博客等。

Django的官网:http://www.djangoproject.com

1.2 安装与卸载

1.2.1 PythonDjango的版本

Django 版本Python 版本
3.23.6, 3.7, 3.8, 3.9, 3.10 (在 3.2.9 中就已经加入了)
4.03.8,3.9,3.10
4.13.8,3.9,3.10,3.11(4.1.3 添加)
4.23.8, 3.9, 3.10, 3.11, 3.12 (4.2.8 添加)
5.03.10、3.11、3.12

1.2.2 安装


$ pip3 install django[==version]

1.2.3 查看Django版本


$ python3 -m django --version


$ django-admin --version

1.2.4 卸载


$ pip3 uninstall django

二、Django项目

2.1 概述

Django项目由一个或多个应用程序(指模块)组成,在每个模块中有相对独立的路由、视图、模型、模板等。

2.2 创建项目


$ django-admin startproject projectname

2.3 启动项目

第一步:在命令行输入以下命令:


$ python3 manage.py runserver [[address:]port]

如:


$ python3 manage.py runserver
$ python3 manage.py runserver 8888
$ python3 manage.py runserver 0.0.0.0:8888

第二步:启动浏览器输入地址即可


Pycharm中启动Django项目

第一步:鼠标右击manage.py,然后从弹出的快捷菜单中选择Modify Run Configuration,再在Parameters文本框中输入runserver [[address:]port]

第二步:鼠标右击manage.py,然后从弹出的快捷菜单中选择Run manage

2.4 项目的目录结构


djangoBasic/,项目根目录
├── db.sqlite3,默认的sqlite3数据库文件
├── djangoBasic,内层目录 -- 包
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py,项目配置文件
│   ├── urls.py,根路由文件
│   └── wsgi.py
└── manage.py,入口文件

2.5 配置


# 项目的根目录
BASE_DIR = Path(__file__).resolve().parent.parent

# 是否开启调试模式:在开发环境中需要开启调试模式,在生产环境中需要关闭调试模式
DEBUG = True

# 已安装且启动的应用程序(模块)
INSTALLED_APPS = []

# 已安装且启用的中间件
MIDDLEWARE = []

# 项目的根路由
ROOT_URLCONF = 'djangoBasic.urls'

# 模板(`Templates`)的配置
TEMPLATES = []

# 数据库的配置
DATABASES = {}

# 语言代码
LANGUAGE_CODE = 'zh-Hans'

# 时区
TIME_ZONE = 'Asia/Shanghai'

三、URL 调度器

URL 调度器也称为URL路由,它允许程序员自由的设计URL地址

3.2 定义URL路由

第一步:在根路由文件(urls.py)中定义路由


path(router,view)

URL地址为字母、数字、下划线、短横线的组合

如:


path('hello/',????)

第二步:定义(视图)函数


def function_name(request):
    ...
    ...

如:


def hello(request):
    print('Hello Django')

相对完整的示例代码如下:


# 函数
def hello(request):
    print('Hello,Django')

# 路由
urlpatterns = [
    # ....
    #代表的是当通过 http://127.0.0.1:8000/hello/访问时,将调用hello函数
	path('hello/',hello),
]

运行结果如下:

在这里插入图片描述

此时产生错误的原因是:(视图)函数没有返回响应对象

Django.http包中提供了HttpResponse类,它用于完成Http响应,所以:


from django.http import HttpResponse
# 函数
def hello(request):
    return HttpResponse('Hello,Django')

此时的运行结果如下:

在这里插入图片描述

第三步:通过链接或表单的action来访问相关的路由

此时产生了另外的两个问题:

第一:如果来访问http://127.0.0.1:8000时将产生404 错误 – 怎么解决?

第二:现在在urls.py中既有路由又有视图函数 – 不便于管理 – 如何便捷管理?

3.2 定义首页的路由


path('',视图函数)

示例代码


from django.http import HttpResponse

def index(request):
    return HttpResponse('Index Page')

urlpatterns = [
    # 首页路由
	path('',index),
]    

3.3 便捷管理路由及视图函数

为了便于管理视图函数,强烈建议将视图函数存储到views.py中,然后再在urls.py中引用该模块即可

urls.py的示例代码如下:


from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('hello/', views.hello),
]


views.py的示例代码如下:



from django.http import HttpResponse


def hello(request):
    return HttpResponse('Hello Django')


def index(request):
    return HttpResponse('Index Page')


对于静态的路由可以直接按需要进行定义,但是对于动态的路由,如访问某一个文章时的ID,此时如何定义?

3.4 路径转换器

路径转换器主要解决动态路由的问题,如:


http://127.0.0.1:8000/user/<id>

路径转换器的基本语法:


path("<类型:参数名称>/<类型:参数名称>",视图函数)

需要注意的是:在定义视图函数时,如果路由中存在路径转换器,那么视图函数也必须存在相同名称的参数

3.4.1 int

int类型的路径转换器自动匹配正整数,类型为int,如:


path("users/<int:id>",views.userinfo),

userinfo的函数代码示例如下:


def userinfo(request,id):
    ...
    ....

3.4.2 str

str类型的路径转换器自动匹配字符串,/除外,类型为str,如:


path("topic/<str:topic>/",views.topic),

3.4.3 slug

slug匹配任意由字母、数字、短横线与下划线组成的字符,其类型为str,如:


path('blog/<slug:title>',views.blog),

3.4.4 uuid

UUID的格式为8-4-4-4-12的十六位进制数字组成,其类型为uuid

Pythonuuid模块


import uuid

# 基于当前服务器ID和时间
uuid.uuid1()
# 基于随机数
uuid.uuid4()

3.4.5 path

path 匹配路径,包括/


path('download/<path:path>/',views.download),

组合使用的案例


path('carts/<str:username>/id/<int:id>/',views.carts),

path('<str:username>/<int:id>/',views.goods),

四、模块

每个Django项目至少存在一个模块(应用程序)

4.1 创建模块


$ python3 manage.py startapp app_name

如:


$ python3 manage.py startapp users

$ python3 manage.py startapp goods

4.2 注册模块

将创建的模块名称添加到配置文件的INSTALLED_APPS列表中,如:


INSTALLED_APPS = [
    # ...
    'goods',
    'users',
]

4.3 分布式路由

所谓的分布式路由是将某个模块下以共同字符串开头的路由写在根路由文件中,不同的部分写在模块内部的urls.py中,当访问时系统将自动把两个部分的URL进行拼接。

include()函数位于django.urls模块内,其作用是将当前路由与指定包含文件的路由进行拼接


include("URLS文件")


# urls.py最简陋的样子
from django.urls import path
from . import views

urlpatterns = [
	path('',views.index),
]


# views.py最简陋的样子
def index(request):
    ...
    ...


unit02

一、DTL

1.1 什么是DTL?

DTL(Django Templates Language)Django模板语言,实际上就是将HTML页面与程序代码进行混合的技术。

1.2 模板配置


#模板配置
TEMPLATES = [
    {
        # 模板的引擎
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 配置模板文件的路径
        'DIRS': [BASE_DIR / 'templates'],
        # 是否查找模块下的目录
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

1.3 render()函数

render()函数位于django.shortcuts模板内:


from django.shortcuts import render

render()函数的语法结构为:


render(request,template_name,context=None)

request代表的HttpRequest 对象

template_name指要渲染的模板文件路径及名称

context指要传递到模板的数据,其类型必须为dict

二、DTL

模板文件内可以使用:注释、变量、标签等

2.1 变量


# 变量
{{ variable_name }}
# 列表或元组
{{ variable_name.index }}
# 字典
{{ variable_name.key }}
#对象属性
{{ variable_name.property }}
#对象方法
{{ varible_name.method s}}

2.2 标签

标签是指模板中进行逻辑控制的代码,如分支结构、循环结构等,标签的基本语法结构为:


{% 标签名称 %}


或者

{% 开始标签名称 %}
...
...
{% 结束标签名称%}


2.2.1 for标签


{% for variable in iterable %}
 ...
 ...
{% endfor %}


{% for variable in iterable %}
 ...
 ...
{% empty %}
 ...
 ...
{% endfor %}

DTL中为循环提供了在其内部使用的变量:

变量描述
forloop.counter正向循环计数器,从1开始
forloop.counter0正向循环计数器,从0开始
forloop.revcounter反向循环计数器,从1开始
forloop.revcounter0反向循环计数器,从0开始
forloop.first当前循环为第一次循环时为True
forloop.last当前循环为最后一次循环时为True

2.2.2 if标签


{% if condition %}
 ...
{% endif %}

{% if condition %}
 ...
{% else %}
 ...
{% endif %}

{% if condition %}
 ...
{% elif condition %}
 ...
{% elif condition %}
 ...
{% else %}
 ...
{% endif %}

2.2.3 表单

1.表单的action属性值为空或者省略action属性,代表表单将提交给自身

2.表单的method属性值为空或者省略method属性,代表表单的提交方式为get

2.2.4 csrf_token


{% csrf_token %}

在以post方式提交的表单内必须在使用{% csrf_token %} 产生令牌

当在表单内添加{% csrf_token %}标签后将产生个名称为csrfmiddlewaretoken的隐藏域


<input type="hidden" name="csrfmiddlewaretoken" value="7erwqas">

2.2.5 静态资源

静态资源是网站用于布局的样式文件、图片文件及脚本文件。

2.2.5.1 静态资源的配置

# 静态文件的路由
STATIC_URL = '/static/'

# 静态文件的位置 
STATICFILES_DIRS = [
    BASE_DIR / 'static'
]

2.2.5.2 访问静态资源

第一步:通过{% load static %}标签加载static标签


{% load static %}

第二步:在模板文件中通过static标签来访问静态资源


{% static '静态文件的的路径及名称' %}

被静态文件引用的文件(如在CSS文件内引用图片),因为该静态文件没有经过模板引擎处理,所以不能使用{% static %}标签来加载 – 只能通过其相对路径实现

unit03

一、DTL

1.1 标签

include标签

include标签用于在一个模板文件中包含另外一个模板文件,语法结构为:


{% include '被包含的模板文件的位置及名称' with variable=value variable=value %}

cycle标签

当每次遇到cycle标签时都会产生一个值,第一次产生第一个值,第二个产生第二值,依次类推。当值用尽时,再次遇到该标签时,就产生第一个值。


{% cycle 'value1' 'value2' 'value3' ... %}

注释


{# 这是一个单行注释 #}

{% comment %}
	第一行
    第二行
{% endcomment%}

1.2 过滤器

过滤器用于转换变量或标签参数的值,其基本语法结构为:


{{ 变量名称|过滤器:参数:参数 }}

safe

当通过变量向模板文件传递HTML内容时,在模板中将把HTML内容中的特殊符号进行替换操作,如>替换为&gt;<替换为&lt;

之所以进行替换的原因是为了防止XSS(Cross-site scripting)攻击(译为跨站脚本攻击)。举例说明:

假设在某个网站中对于某条新闻发表了评论,内容如下:

这篇新闻很好
<script>
while(true){
    window.alert("哈哈哈");
}
</script>

当用户发表该评论后,其内容将写入到服务器的数据库 — 不会产生任何问题

但是,如果该评论被某个用户通过浏览器进行访问时,那么其中的


<script>
while(true){
    window.alert("哈哈哈");
}
</script>

将被浏览器认为是JavaScript脚本 - - 并且为死循环!!!

如何解决 – 将输入的><等替换为对于HTML实体,如果此时再有用户输入以下评论:


这篇新闻很好
<script>
while(true){
    window.alert("哈哈哈");
}
</script>

将输入的><等替换为对于HTML实体的结果为:

这篇新闻很好

&lt;script&gt;
while(true){
    window.alert(&quot;哈哈哈&quot;);
}
&lt;/script&gt;

Django模板中如果认为传递到模板的HTML内容为安全内容,则需要通过safe过滤器

striptags

striptags过滤器用于去掉所有的HTML标记

truncatechars

truncatechars过滤器用于截断字符串并且指定长度

floatformat

floatformat过滤器用于对浮点数进行四舍五入

date

date过滤器用于格式化日期和时间

格式描述
Y
m月,带有前导零
d日,带有前导零
H小时,带有前导零
i分钟,带有前导零
s秒,带有前导零

yesno

True,False,None(可选)的值映射到以逗号分隔的字符串

join

join过滤器使用指定的分隔符将列表成员连接成字符串

二、Http请求

当一个url被请求时,Django会自动创建HttpRequest对象,在该对象内包含的请求的元数据,然后再加载相应的视图函数,并且将HttpRequest对象作为视图函数的第一个参数


# 当前request参数代表的就是HttpRequest对象
def function_name(request):
    ...
    ...

HttpRequest对象存在的属性除非另有说明外都是只读属性

3.1 属性

method属性

method属性用于获取HTTP的请求方式,返回结果为英文大写字母


str HttpRequest.method

POST属性

HttpRequest 对象的POST 属性将返回django.http.request.QueryDict的对象,包含HTTP POST提交的数据,其语法结构为:


QueryDict HttpRequest.POST

GET属性

HttpRequest 对象的GET属性将返回django.http.request.QueryDict的对象,包含HTTP GET提交的数据,其语法结构为:


QueryDict HttpRequest.GET

具有浏览框的表单的限制

A.表单的提交方式只能为POST

B.必须设置表单的enctype="multipart/form-data"属性


<form method="post" enctype="multipart/form-data">
    ...
    ...
</form>

FILES属性

FILES属性返回django.utils.datastructures.MultiValueDict对象

对于上传的文件超过2.5MB 将返回TemporaryUploadedFile对象,否则返回InMemoryUploadedFile对象,它们都继承自UploadedFile对象,而UploadedFile继承自File对象,所以可以访问File对象的namesize等属性

3.2 QueryDict对象

QueryDict对象继承自django.utils.datastructures.MultlValuDict对象,MultiValue对象的方法有:

get()用于获取指定key的值,否则返回default


MultiValue.get(key,default=None)

getlist()用于获取指定key的值,否则返回default


list MultiValue.getlist(key,default=None)

keys()返回由键名组成的列表


list MultiValue.keys()

values()返回由键值组成的列表


list MultiValue.value()

items()

dict()返回由键名和键值组成的字典


dict MultiValue.dict()

unit04

一、HTTP响应

每一个视图函数必须存在一个响应对象。

render()函数返回是HttpResponse对象,它的基本原理是将传递的模板文件与字典数据进进行混合后返回一个字符串的结果,该结果带入到HttpResponse对象的参数中。

HttpReponse对象位于django.http模板内


from django.http import HttpResponse

其构造函数的结构为:


HttpResponse(content,content_type='text/html')

其中

content 代表的是响应的字符串信息

content_type 代表的响应的类型,默认为text/html

常用的响应类型有

响应类型说明
text/plain文本
text/htmlHTML
text/cssCSS
text/javascriptapplication/javascriptJS
application/jsonJSON

JsonResponse对象

JsonResponse 对象继承自HttpResponse对象,其作用是返回JSON响应,语法结构为:



#默认情况下,只能为字典对象转换为JSON格式的字符串
#对于非字典数据(列表数据)必须将safe参数设置为False
JsonResponse(data,safe=True)

二、模型

2.1 概述

模型 (Model)是Django为了构建和操纵数据库而提供的抽象层。

模型用于表示和操纵数据表及其记录。

所以首先通过MySQL客户端创建数据库,如:


CREATE DATABASE IF NOT EXISTS knowbase;

SHOW DATABASES;

2.2 配置


DATABASES = {
    'default': {
        # 数据库引擎的类型
        'ENGINE': 'django.db.backends.mysql',
        # MySQL数据库服务器的地址
        'HOST':'127.0.0.1',
        # MySQL数据库服务器的端口号
        'PORT':3306,
        # MySQL数据库服务器用户的用户名
        'USER':'root',
        # MySQL数据库服务器用户的密码
        'PASSWORD':'123456',
        # MySQL数据库服务器的数据库名称
        'NAME': 'knowbase',
    }
}

2.3 创建模型

模型需要在模块下的models.py文件中进行定义,所有的模型都必须继承自django.db.models.Model类,结构如下:


class ClassName(models.Model):
    field_name = models.数据类型([选项[,...]])
    ...
    ...

2.4 数据类型

数据类型描述
CharField(max_length=长度)VARCHAR
SmallIntegerField()SMALLINT
PositiveSmallIntegerField()SMALLINT UNSIGNED
IntegerField()INT
PositiveIntegerField()INT UNSIGNED
BigIntegerField()BIGINT
PositiveBigIntegerField()BIGINT UNSIGNED
BooleanFieldTINYINT(1)
FloatField(max_digits=数字总长度,decimal_places=小数点后的数字长度)FLOAT(M,D)
DecimalField(max_digits=数字总长度,decimal_places=小数点后的数字长度))DOUBLE(M,D)
TextField()LONGTEXT
DateField()DATE
TimeField()TIME
DateTimeField(auto_now_add=是否自动记录创建时间,auto_now=是否自动记录修改时间)DATETIME

2.5 数据迁移

第一步:生成移迁文件


$ python3 manage.py makemigrations

第二步:数据迁移


$ python3 manage.py migrate

add过滤器用于进行字符串的拼接,如


{{ username|add:'ABC'}}
<!--假定username变量的值为Tom,那么拼接完的结果为 TomABC -->

三、管理器

Django的模型中要实现数据表中记录的管理是通过管理器来实现的

Django为每个模型提供了一个名称为objects的管理器,它作为模型的属性进行访问


模型类.objects

如:


from .models import Book

print(type(Book.objects))

all()方法

all()方法用于返回管理器的全部对象,其语法结构为:


QuerySet Manager.all()

get()方法

get()方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常


Object Manager.get(condition[,....])

如果以主键字段进行查找的话,可以写为


Book.objects.get(id=5)
# 或者
Book.objects.get(pk=5)

四、QuerySet

QuerySet称为查询集或者查询结果集,用于表示与管理器相关查询结果。

Queryset可以进行切片、复制及过滤等操作

all()方法

all()方法用于返回结果集中的全部对象,其语法结构为:


QuerySet QuerySet.all()

get()

get()方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常


Object QuerySet.get(condition[,...])

filter()

filter()方法用于根据指定的条件对结果集进行过滤,返回一个新的结果集


QuerySet QuerySet.filter(字段名称__查询谓语=[,...])

first()

first()方法用于返回结果集中的第一条记录


object QuerySet.first()

last()

last()方法用于返回结果集中的最后一条记录


object QuerySet.last()

order_by()

order_by()方法用于对结果集进行排序


QuerySet QuerySet.order_by('字段名称'[,....])

降序排列时,字段名称的写法为-字段名称

查询谓语

  • exact,相等(区分大小写),可以在使用时直接用=进行操作
  • iexact,相等,不区分大小写
  • gt,大于
  • gte,大于等于
  • lt,小于
  • lte,小于等于
  • in,在指定值内,字段名称__in=(value,value,vlaue,..)
  • range,区间范围同,字段名称__range=(min,max)
  • contains,包含指定的字符,区分大小写
  • icontains,包含指定的字符,不区分大小写
  • startswith,以指定字符开头,区分大小写
  • istartswith,以指定字符开头,不区分大小写
  • endswith,以指定字符结尾,区分大小写
  • iendwith,以指定字符结尾,不区分大小写

F函数


from django.db.models import F

在查询时使用到某表内的字段时,必须通过F函数将其引用


Book.objects.filter(sale_price__gte=200+F('cost_price'))

unit05

一、模型

values()

values()方法用于限制返回的字段,可迭代对象为字典


QuerySet QuerySet.values(*fields)

结果样式如:


<QuerySet [{'id': 1}, {'id': 2}]>

values_list()

values_list()方法用于限制返回的字段,可迭代对象为元组


QuerySet QuerySet.values_list(*fields)

结果样式如:


<QuerySet [(1,), (2,)]>

only()

only()方法用于限制返回的字段,可迭代对象为模型实例


QuerySet QuerySet.only(*fields)

结果样式如:


<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>

query

query属性返回当前查询结果集对应的SQL语句


str QuerySet.query

Q函数

Q函数用于对查询表达式进行连接,然后进行逻辑运算


from django.db.models import Q

exclude()

exclude()方法返回不符合指定条件的记录


Queryset QuerySet.exclude(条件表达式)

count()

count()方法用于获取结果集包含的记录总数


int QuerySet.count()

aggregate()

聚合函数有CountMaxMinSumAvg,位于


from django.db.models import Count,Sum,Avg,Max,Min


dict QuerySet.aggregate(key=Count('field_name'))
dict QuerySet.aggregate(key=Max('field_name'))
dict QuerySet.aggregate(key=Min('field_name'))
dict QuerySet.aggregate(key=Sum('field_name'))
dict QuerySet.aggregate(key=Avg('field_name'))

annotate

aggregate()方法用于对整个Queryset进行聚合操作,而annotate()方法用于对特定的字段进行聚合


Queryset QuerySet.annotate(key=Count('field_name'))
Queryset QuerySet.annotate(key=Max('field_name'))
Queryset QuerySet.annotate(key=Min('field_name'))
Queryset QuerySet.annotate(key=Sum('field_name'))
Queryset QuerySet.annotate(key=Avg('field_name'))

unit 06

一、HttpRequest对象

path属性

path属性用于获取请求URL


str HttpRequest.path

get_full_path()方法

get_full_path()方法用于获取请求URL及查询字符串


str HttpRequest.get_full_path()

redirect() 函数

redirect()函数用于跳转到其他URL


from django.shortcuts import redirect

redirect(to)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值