锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

django--项目结构,路径匹配,path函数,re_path函数,请求对象

时间:2023-05-07 20:37:01 hva扩散硅压力变送器

项目结构

settings.py

全局项目配置文件

# settings文件 全写名称:常量(不变数据) 8from 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 -->重定向(浏览器行为)

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章