django--项目结构,路径匹配,path函数,re_path函数,请求对象
时间:2023-05-07 20:37:01
项目结构
settings.py
全局项目配置文件
# settings文件 全写名称:常量(不变数据) 8) from pathlib import Path # 保存项目路径 BASE_DIR = Path(__file__).resolve().parent.parent # django秘钥 加密 SECRET_KEY = 'django-insecure-fci)6y98hq=*zxs6_-6z o^i_5x4hva9((8*snl%qz8*b50)it' # 就开发而言,它将分为四种环境: # 1.开发环境 # 2.测试环境 (测试部门对开发人员编写的程序进行测试) # 3.演示环境 # 4.项目上线(外部人访问) DEBUG = True #开发是TRUE ,项目提交后false # 允许访问的主机ip ALLOWED_HOSTS = ['*'] # 已安装的应用程序 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] # 中间件 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 = 'demo.urls' # 模板 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',
],
},
},
]
# wsgi应用程序
WSGI_APPLICATION = 'demo.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
# 数据库 mysql
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# 链接数据库引擎
'ENGINE': 'django.db.backends.mysql',
# 使用的库
'NAME':'dj14',
# 用户名
'USER':'root',
# 密码
'PASSWORD':'qwe123',
# ip地址
'HOST':'127.0.0.1',
# mysql默认端口号
'PORT':'3306'
}
}
# 密码认证器
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',
},
]
# https://docs.djangoproject.com/en/3.2/topics/i18n/
# 语言编码
LANGUAGE_CODE = 'zh-hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
settings文件中需要修改:databases设置 记得去数据库中创建相对应的库
创建子应用
为什么要创建子应用?
因为一个完整的django项目是分为多个功能的,每个功能对应一个子应用,代码更好维护。
怎么创建子应用:先进入djdemo的demo文件夹下
cd /djangoDemo/djangoDemo
python manage.py startapp day2 #创建子应用 day2是子应用名字
子应用的目录结构:其中少了urls.py文件,需要自己创建
url路由
# demo/urls.py 项目启动会自动加载主应用的路由文件,提供用户访问的入口
urlpatterns = [
path('admin/', admin.site.urls),
# 引入子应用的路由文件
path('day2/',include('day2.urls')),
]
# day2/urls.py
urlpatterns = [ # url匹配
path('index',index),
]
# day2/views.py
def index(request): # 默认第一个参数为request request:django封装好的对象,index(request对象)
# 返回浏览器数据:需要使用response对象
return HttpResponse('index')
127.0.0.1:8000/day2/index :路由(路径)
组成部分:
1. / #入口urls文件 djangoDemo.urls文件
2. day2/ # 入口文件中配置的day2
3. index # 子应用的路由文件配置
path函数
常规写法
# day2/urls.py
# 第一个参数:字符串类型,用来匹配请求路径
# 第二个参数:函数的名字,用来处理请求
path('index',index),
转换器写法
# 转换器写法 用来匹配url中变量 (灵活)
# day2/urls.py
path('index/' ,index),
# day2/views.py
#index(request,name)
def index(request,name):
return HttpResponse('浏览器的地址栏name是{}'.format(name))
# day2/urls.py
# 限定变量的类型为int类型
path('index2/' ,index2),
# day2/views.py
def index(request,id):
return HttpResponse('浏览器的地址栏id是{}'.format(id))
path()
用的比较少的写法 (**kwargs)
# day3/urls.py
# 参数3 关键字参数 实际用的不多
path('kw_test',kw_test,kwargs={
'language':'python','teacher':'coco','age':18}),
# day3/views.py
def kw_test(request,**kwargs):
return HttpResponse('{}'.format(kwargs))
加别名写法
# day3/urls.py
# 参数 name参数 : 给路由字符串加了个别名
path('name_test',name_test,name='hello'),
# day3/views.py
def name_test(request):
return HttpResponse(reverse('hello'))
参数全部使用
# 浏览器地址栏
127.0.0.1:8000/day3/all_together/1/have
# day3/urls.py
path('all_together//have' ,all_together,kwargs={
'language':'python'},name='all_together')
# day3/views.py
# 写法1
def all_together(request,money,language):
return HttpResponse('all_together')
# 写法2
def all_together(request,*args,**kwargs):
# *args,**kwargs 属于可变参数,第一个接收的是位置参数,最终会封装成元祖的方式
# 第二个接收的关键字参数,最终会封装成字典的方式
return HttpResponse('all_together')
正则匹配 re_path()
当需要对路由进行精准限制的时候,就可以使用正则模式匹配
使用的函数是re_path (除了第一个参数和path有不同之外,其他参数的使用是一样的)
re_path('正则模式',视图函数名,name='路由别名')
正则模式 :(?P<name>正则表达式)
# 127.0.0.1:8000/day3/get_age/11 可以匹配
# 127.0.0.1:8000/day3/get_age/1111 不可以匹配
re_path('get_age/(?P\d{1,2}$)' ,get_age),
def get_age(request,age):
return HttpResponse('get_age函数的age是={}'.format(age))
# path('1.html',goods),
# path('2.html',goods),
# 需求:根据不同的商品id展示不同的页面
re_path('^(?P\d+)\.html' ,goods),
def goods(request,id):
return HttpResponse('商品{}的详情页'.format(id))
请求响应对象
path('getrequest',get_request),
# http://127.0.0.1:8000/day3/getrequest?lan=python 查询参数
def get_request(request):
# print(request.GET) #
# 获取一个参数
# print(request.GET['lan'])
# python 直接通过中括号key取值,如果key不存在,则异常
# print(request.GET.get('lan')) get方法返回字符串类型
# #python 通过get方法key取值,如果key不存在,返回None
# 当请求传参的时候,key对应了多个值,就使用getlist方法获取
# print(request.GET.getlist('lan'))
# print(request.path_info) #/day3/getrequest 获取路由地址
# print(request.method) # GET 获取请求方式 get/post
# 获取post提交的参数
# print(request.POST) #
# print(request.POST.get('name'))
# 获取post提交的文件
# print(request.FILES) # 获取到文件对象
return HttpResponse('getrequest')
get请求获取参数的方式:
获取单个value :request.GET.get('key')
获取多个value :request.GET.getlist('key')
# 如果要post请求提交 先把settings中关于csrf的验证注释掉
post请求获取参数的方式
request.POST.get('key')
客户端上传文件获取的方式
request.FILES.get('key')
获取请求类型
request.method
if request.method == 'POST':
# 做处理
return HttpResponse('post')
elif request.method == 'GET':
return HttpResponse('get')
客户端 传递给后端 —>请求对象
后端传递给客户端—>响应对象
响应状态码
200 —>响应成功
404—>资源找不到
405—>请求不被允许
500—> python代码有问题
301 302 -->重定向(浏览器行为)