一、创建项目应用
目录
启动项目【测试开发阶段】
django-admin startproject myapp(应用名称)
- 终端cd到项目文件夹 cd my_django
- 进入到项目文件夹后,执行python manage.py runserver 启动django服务【注:该启动方式下,django在前台启动服务,默认监听8000端口】【linux环境用python3】
- 浏览器访问http://127.0.0.1:8000 可看到django的启动页面
【注:如果更换端口,可用python manage.py runserver 端口号】
db.sqlite3:sql文件,后续用mysql替代;
my_django/my_django:项目同名文件夹;
__init__.py:python包初始化文件;
Wsgi.py:web服务网关的配置文件-Django正式启动时,需要用;
Urls.py:项目的主路由配置-http请求进入django时,优先调用该文件;
Settings.py:项目的配置文件-包含项目启动时需要的配置;
manage.py 包含项目管理的子命令,比如:
- python manage.py runserver 启动服务
- python manage.py startapp 创建应用
- python manage.py migrate 数据库迁移
…
直接执行python manage.py 可列出所有django子命令
Settings.py
它包含了django项目启动的所有配置项
配置项氛围公有配置和自定义配置
配置项格式例:BASE_DIR =’XXXX’ 【BASE_DIR必须大写】
公有配置 – django官方提供基础配置:https://docs.djangoproject.com/en/2.2/ref/settings/
BASE_DIR
用于绑定当前项目的绝对路径(动态计算出来的),所有文件夹都可以依赖此路径
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
# 项目绝对路径
BASE_DIR = Path(__file__).resolve().parent.parent
DEBUG
用于配置django项目的启动模式,取值:
True表示开发环境中使用,开发调试模式(用于开发中)
False表示当前项目运行在生产环境中
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# 启动模式
# True - 调试模式
# 1.检测代码改动后,立刻重启服务
# 2.报错页面
# False - 正式启动模式/上线模式
ALLOWED_HOSTS
设置允许访问到本项目的host头值
[]空列表,表示只有请求头中host为127.0.0.1,localhost能访问本项目-DEBUG=True时有效;
[‘*’],表示任何请求头的host都能访问该项目;
[‘192.168.1.3’,’127.0.0.1’],表示只有当前两个host头的值能访问该项目。
# 过滤请求头HOST头 ALLOWED_HOSTS = ['127.0.0.1'] ['*']
ALLOWED_HOSTS = []
INSTALLED_APPS
指定当前项目中安装的应用列表
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
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',
]
TEMPLATES
用于指定模板的配置信息
# 模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
DATABASES
用于指定数据库的配置信息
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
LANGUAGE_CODE
用于指定语言配置,英文:”en-us” 中文:”zh-Hans”
LANGUAGE_CODE = 'en-us' # 'zh-Hans'
TIME_ZONE
用于指定当前服务器端时区,世界标准时间:”UTC”,中国时区:”Asia/Shanghai”
TIME_ZONE = 'UTC' # 'Asia/Shanghai'
ROOT_URLCONF
用于配置住url配置’my_django.urls’,ROOT_URLCONF=’my_django.urls’
# 主路由
ROOT_URLCONF = 'my_django.urls'
二、URL和视图函数
URL:统一资源定位符uniform resource locator,用来表示互联网某个资源的地址
一般语法格式:[代表其中的内容可省略]
Protocol://hostname[:port]/path[?query][#fragment]
协议-主机名-端口号-路由地址-查询-信息片段/锚点[html方便元素定位]
Django如何处理URL请求
浏览器地址栏输入http://127.0.0.1:8000/page/2003/
- django从配置文件settings.py中根据ROOT_URLCONF找到主路由文件;默认情况下,该文件在项目同名目录下的urls;例如my_django/my_django/urls.py
- django加载主路由文件中的urlpatterns变量[包含很多路由的数组]
- 依次分配urlpatterns中的path,匹配到第一个合适的且中断后续匹配
- 匹配成功-调用对应的视图函数处理请求,返回相应
- 匹配失败-返回404响应
视图函数是用于接收一个浏览器请求(HttpRequest对象)并通过HttpResponse对象返回响应的函数。此函数可以接收浏览器请求并根据业务逻辑返回相应的响应内容给浏览器
语法:
def xxx_view(request[,其它参数…]):
return HttpResponse对象
样例:
# file:<项目同名文件下>/views.py
from django.http import HttpResponse
def page1_view(request):
html = “<h1>这是第1个页面</h1>”
return HttpResponse(html)
三、路由配置-path
path()函数
导入-from django.urls import path
语法-path(route,views,name=None)
参数:
Route:字符串类型,匹配的请求路径
Views:指定路径所对应的视图处理函数的名称【注:函数后面不能加(),引用的是函数,而不是函数的结果】
Name:为地址起别名,在模板中地址反向解析时使用
Path转换器
语法:<转换器类型:自定义名>
作用:若转换器类型匹配到对应类型的数据,则将数据按照关键传参的方式传递给视图函数
例:path(‘page/<int:page>’,views.xxx)
urls.py
urlpatterns = [
# 计算器http://127.0.0.1:8000/整数/运算符/整数
path('<int:left>/<str:op>/<int:right>', views.page_calculate),
]
views.py
def page_calculate(request,left,op,right):
if op == "add":
result = left+right
elif op == "sub":
result = left-right
elif op == "mul":
result = left*right
else:
return HttpResponse("Your op is wrong!")
return HttpResponse("这是我设计的计算器,结果为%s" %(result))
路由配置 re_path()函数
在url的匹配过程中可以使用正则表达式进行精确匹配
语法:
re_path(reg,view,name==xxx)
正则表达式为命名分组模式(?P<name>pattern);匹配提取参数后用关键字传参方式传递给视图函数
urls.py
urlpatterns = [
# 路由一:http://127.0.0.1:8000/birthday/四位数字/一到两位数字/一到两位数字 年月日
# 路由二:http://127.0.0.1:8000/birthday/一到两位数字/一到两位数字/四位数字 月日年
# 最终输出:生日为:xxxx年xx月xx日
re_path(r'^birthday/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})$', views.birthday_cal1),
re_path(r'^birthday/(?P<m>\d{1,2})/(?P<n>\d{1,2})/(?P<year>\d{4})$', views.birthday_cal2),
]
views.py
def birthday_cal1(request,year,month,day):
html_birthday_cal1 = "生日为:%s年%s月%s日"%(year,month,day)
return HttpResponse(html_birthday_cal1)
def birthday_cal2(request,m,n,year):
html_birthday_cal2 = "生日为:%s年%s月%s日"%(year,m,n)
return HttpResponse(html_birthday_cal2)
四、请求和响应
请求和响应
-请求是指浏览器端通过HTTP协议发送给服务器端的数据
-响应是指服务器端接收到请求后做相应的处理后再回复给浏览器端的数据
GET请求和POST请求
无论是GET还是POST,统一都由视图函数接收请求,通过判断request.method 来区分具体的请求操作。
GET
GET请求动作,一般用于向服务器获取数据
能够产生GET请求的场景:
-浏览器地址栏输入URL回车
-a标签的超链接<a href=”地址?参数=值&参数=值”>
-form表单中的method为get【一般较少使用】
print(request.GET ['参数名']) # QueryDict
print(request.GET.get['a'])
print(request.GET.get('c','there is no c'))
print(request.GET.getlist('a'))
POST
POST请求动作,一般用于向服务器提交大量/隐私数据
客户端通过表单等POST请求将数据传递给服务器端,如:
<form method=’post’ action=”/login”>
姓名:<input type=”text” name=”username”>
<input type=’submit’ value=’登录’>
</form>
服务端接收参数
通过request,method来判断是否为POST请求,如
If request.method == ‘POST’:
处理POST请求的数据并响应
else:
处理非POST请求的响应
print(request.POST['a']) #request.POST绑定questyDict
print(request.POST.get('c','there is no c'))
print(request.POST.getlist('b'))
# 取消csrf跨站伪造验证,否则django将会拒绝客户端发来的请求,报403响应
禁止掉settings.py中MIDDLEWART中的CsrfViewsMiddleWare的中间件
# 中间件
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',
]
Django的设计模式及模板层
MVC和MTV
模板配置
模板的加载方式
视图向模板传递变量
模板层-变量和标签
模板层-过滤器和继承
url反向解析
....##待续##...