Django02 - 入门2
一:django目录介绍
- django001: 项目名
- app01: app名字
migrations: 数据库变更相关记录
admin.py: 后台管理
apps.py: app的相关配置
models.py: 数据库相关
tests.py: 测试相关
views.py: 视图函数
- django001: 和项目名同名的目录
settings.py: 配置文件
urls.py: 总路由
wsgi.py: wsgi服务器配置
- templates: 模板文件(一堆HTML)
- manage.py: 启动项目、创建app、各种命令的操作
二:app介绍
app就是一个独立的功能,一个包
1.创建app
python3 manage.py startapp app名字
2.作用
没有app,完全可以(一般情况下,1个项目,至少有1个app)
多个app的作用:区分不同的功能(例如:淘宝有 用户相关功能、商品相关功能、订单相关功能,可以放在不同app中)
- 解耦合,把类似的功能写到一起,组成一个app
3.创建第二个app
python3 manage.py startapp 第二个app名字
4.app的注册
方式1:
'app01.apps.App01Config'
方式2:
'app01'
三:django的启动方式
1.方式1 - PyCharm
点击运行
如果不行,就进行如下设置
2.manage.py
python3 manage.py runserver 127.0.0.1:8000
python3 manage.py runserver 8000 # 不指定IP地址,默认就是本地地址
python3 manage.py runserver 0.0.0.0:8000 # 外部网络亦可访问
3.django的socket
在django中,默认情况下,使用的socket是wsgiref
,性能很低,仅用于测试
真正后期上线的时候,需要使用性能更高的web服务器:uwsgi
了解:cgi, fastcgi, wsgi, uWSGI, uwsgi, wsgiref
四:配置文件详解
import os
# BASE_DIR:项目的根路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# SECRET_KEY:密钥,项目中默认的一些加密 会用到它(可以改,但不能删)
SECRET_KEY = 'ov7178+j+$e4x$_vui@f1)o@ymm963-96^%6zh+spq-yy2ws@*'
# DEBUG:调试模式,开发阶段是True,上线阶段是False。
# 如果设置成True的话,可以看到响应的提示和路径,报错信息更完善。
DEBUG = True
# ALLOWED_HOSTS:上线阶段使用,允许谁访问,*表示全部
ALLOWED_HOSTS = []
# INSTALLED_APPS项目所有的app,是一个列表,新增的app就是在这里注册的
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
# MIDDLEWARE:中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# ROOT_URLCONF:根路由的文件地址,位置是可以改变的
ROOT_URLCONF = 'django001.urls'
# TEMPLATES:模板文件存放路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] # 重点看这里,这个路径是一个列表,django-admin创建的django项目,需要手动配置
,
'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',
],
},
},
]
# WSGI_APPLICATION:wsgi服务器使用的是哪个
WSGI_APPLICATION = 'django001.wsgi.application'
# DATABASES:数据库连接配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# AUTH_PASSWORD_VALIDATORS:一些模块,内置模块、内置app相关
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# 国际化相关:语言和时区
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# STATIC_URL:静态文件配置相关
STATIC_URL = '/static/'
重点
1.数据库
2.静态文件相关
3.根路由
4.模板文件
5.是否是调试模式
6.app是否注册
五:路由简单入门
路由:地址 与 视图函数 的映射关系 —— uels.py
# urlpatterns列表:列表内放了url函数的执行结果
# 使用很简单,复制一行,改一下第一个参数(带有正则表达式的路径)和第二个参数(对应的视图函数内存地址)
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 在内部,请求来了,路径匹配成功,内部自动调用index(request),把request传入
url(r'^index/', view.index),
]
六:视图简单入门
1.视图函数:views.py
可以不放在views.py
中,但是通常放在里面
2.请求对象
-
request.method —— get、post
-
request.GET —— 当做字典来用
-
request.POST —— post形式传递的参数
post请求可不可以在请求地址中携带数据?
可以
# request必须传,约定俗称都使用request
# request是一个对象,请求的对象。请求过来的是符合HTTP协议的数据包(字符串)
# django把HTTP请求,拆分、封装到看request对象中
# 拆HTTP:1.字符串拆成字典(wsgiref做的)2.封装到request对象中
# request对象中一定有档次HTTP请求的所有东西:请求地址、请求方式、请求头、请求体
def index(request):
# 1.请求方式(常用:GET、POST)浏览器地址栏中发出的都是GET请求
print(request.method)
# 2.请求的参数:get请求是这种形式:http://127.0.0.1/index?name=Darker&age=18
print(request.GET) # 把它当成字典
# print(request.GET.get('name'))
print(request.GET['name']) # 可能会报错,所以推荐用get取值
# print(request.GET.get('age'))
# 3.POST形式提交的数据(数据存放在请求体(body体)中)
print(request.POST) # 把它当成字典
return HttpResponse('OK')
3.响应对象
① HttpResponse(一个类):返回字符串形式
return HttpResponse('<h1>Hello World</h1>')
② render(一个函数,返回HttpResponse
的对象):返回模板文件
return render(request, 'index.html')
③ redirect(一个函数,返回HttpResponse
的对象):重定向
return redirect('/index')
return redirect('http://www.xuexianqi.top')
七:静态文件配置
静态文件:js
、css
、img
等
1.去settings.py
中配置
# 静态文件配置相关
STATIC_URL = '/static/'
# 再配一个 STATICFILES_DIRS=列表(列表内写路径)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'), # 真实的静态文件路径
)
2.新建一个static文件夹
在该文件夹下,新建:img
、css
、js
文件夹。
以后,在相应的目录,放相应的代码。
3.在模板的HTML中使用
<script src='/static/jquery.js'></script>
4.静态文件的本质
STATIC_URL = '/static/'
其实就是开了一个隐藏的路由
八:简单的登录功能
路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^$', views.login),
url(r'^index/', views.index),
]
视图函数
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
# 创建数据库连接
conn = pymysql.connect(
host='127.0.0.1',
user='root',
database='userinfo',
port=3306
)
# 拿到1个游标
cursor = conn.cursor()
# 执行sql
cursor.execute('select * from user where username=%s and password=%s', (username, password))
# 获取结果
ret = cursor.fetchone()
print(ret)
if ret:
# return redirect('/index')
return render(request, 'index.html')
else:
return HttpResponse('账号或密码错误!')
def index(request):
return render(request, 'index.html')
九:MTV与MVC
MVC架构 - 主流的web框架
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,它们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求。
Web应用分为模型(M)、视图(V)、控制器(C)
- M - Model:数据库相关操作
- C - Controler:控制器,逻辑相关,逻辑代码
- V - View:视图,模板文件
MVT架构 - Django的框架
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同
- M - Model(模型):数据库相关操作,负责业务对象和数据库的关系映射(ORM)
- T - Template(模板):(就是MVC的V层)负责如何把页面展示给用户(html)
- V - View(视图):(路由+V=MVC的控制器)负责业务逻辑,并在适当时候调用Model和Template
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户)。
视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
十:django请求生命周期
同步框架的并发量:峰值 - 300
0.近几年Python中的几个框架:Sanic、FastAPI(异步框架)
1.Python中的web服务器都符合wsgi协议
2.web服务器
任何语言都会有一个web服务器,负责把HTTP请求转换成这门语言的变量
Python:wsgiref(性能很低)、uwsgi(C语言写的),200多并发量
Java:Tomcat、jboss(300多并发量)
PHP:php服务器
3.django生命周期
十一:虚拟环境讲解,pycharm配置
1.虚拟环境的作用
隔离项目,每个项目有自己依赖的模块和包。不同的模块和包的版本就不会相互影响。
2.PyCharm中配置虚拟环境
十二:ORM概述
1.什么是ORM?
Object Relational Mapping,简称ORM,是对象关系映射(和语言无关)
数据库中的表 - 对应程序的一个类
数据库中的一行数据 - 对用程序中的一个对象
2.Python中常见的ORM框架
Django的ORM框架
sqlachemy ORM框架
3.Java:(扩展),Java中写web框架
ssh框架:spring + structs(有漏洞) + hibernate(ORM框架)
ssm框架:spring + springMVC + mybatis(ORM框架,可以写原生sql)
springboot:sb框架(全家桶),内置了Tomcat
springcould:微服务
4.ORM可以做的事
- 创建表(但是不能创建数据库,只能手动创建数据库)
- 增加删除表内字段
- 增删改查数据
十三:django中orm的使用
1.创建UserInfo表 - 在models.py
中写一个类
2.表中有字段(类属性)
第一步:models中书写类
from django.db import models
# 一定要继承
class UserInfo(models.Model):
# 字段属性==》由后面的对象决定
# 该字段自增,并且是主键
id = models.AutoField(primary_key=True)
# 该字段是varchar类型,长度是32(唯一约束,是否是索引,默认值是什么,是否可以为空)
name = models.CharField(max_length=32)
# 密码字段
password = models.CharField(max_length=64)
第二步:执行数据迁移命令
python3 manage.py makemigrations # 会在migrations文件夹下创建一条记录
python3 manage.py migrate