IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django(第一周) -> 正文阅读

[Python知识库]Django(第一周)

一、基本介绍

Django是一种Web框架,用于搭建Web应用程序,免去不同Web应用相同代码部分的重复编写,只需关心Web应用核心的业务逻辑实现

Web应用程序的本质:接收并解析HTTP请求,获取具体的请求信息,处理本次HTTP请求,即完成本次请求的业务逻辑处理,构造并返回处理结果——HTTP响应

Web应用处理流程:

?Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式。

Django框架的核心:

1.一个面向对象 的映射器,用作数据模型(以 Python 类的形式定义)和关系型数据库间的介质;

2.一个基于正则表达式的 URL 分发器;

3.一个视图系统,用于处理请求;

4.一个模板系统。

MVC模式:

?

优点:分层,结构清晰,耦合性低,大型项目代码的复用性得到极大的提高,开发人员分工明确,提高了开发的效率,维护方便,降低了维护成本。

缺点:简单的小型项目,使用MVC设计反而会降低开发效率,层和层虽然相互分离,但是之间关联性太强,没有做到独立的重用。

?二、创建虚拟环境

项目不同时,需要用到的python的包也不同,为了方便管理项目和所用的包,我们可以为项目创建一个虚拟环境

创建虚拟环境需要用到一个第三方库:virtualenvwrapper

# 创建虚拟环境
mkvirtualenv xxx

# 退出虚拟环境
deactivate

# 查询虚拟环境
workon

# 进入虚拟环境
workon xxx

# 删除虚拟环境
rmvirtualenv xxx

虚拟环境的管理:

在自己想存放虚拟环境的路径下创建一个文件夹(我创建在了d盘下,文件夹名字叫做ENVS)

打开系统环境变量,在系统环境变量中添加变量名为:WORKON_HOME(必须是这个),变量值为:D:\ENVS(改成自己的路径)

Pycharm中使用虚拟环境:

File -> Settings -> Project Interpreter -> 点击齿轮 -> Add -> 点击existing environment -> 选择虚拟环境的路径D:\ENVS\django\Scripts\python.exe

因为我创建的虚拟环境叫做django,所以路径是这样的

注意:路径一定要选择到自己创建的虚拟环境名称文件夹下面的scripts文件夹中的python.exe

?三、Django项目的创建

Django项目创建命令:django-admin startproject xxx

创建好项目后养成习惯,右键项目名的文件夹,找到mark directory as,选择source root,即把项目文件夹设置成根目录,导包时方便我们的编辑器去查找

子应用创建命令:python manage.py startapp xxx? ?(创建前需要在settings.py中导入os模块,即加入import os而必须进入项目文件夹目录)

注册子应用:在settings中的INSTALLED_APPS中添加:子应用名.apps.(apps.py文件中)类名

养成习惯没创建一个子应用就要对其进行注册

启动django服务:python manage.py runserver

Settings文件中的一些参数:

BASE_DIR:项目所在目录,如果我们print(BASE_DIR),在我们启动django服务时会输出两次,这是因为会产生两个线程加载settings文件,一个用于服务开发人员,另一个用于监控文件是否发生改变
DEBUG:默认等于True,即处于开发模式;False生产模式
ALLOWED_HOSTS = []:控制哪些域名和IP可以对我们的网站进行访问,当DEBUG为False时,必须添加允许访问的域名和IP,*表示允许所有域名和IP进行访问
INSTALLED_APPS:用于注册自带的子应用
MIDDLEWARE:中间件,修改我们的请求和响应后返回
ROOT_URLCONF:根路由目录
TEMPLATES:模板;列表中的DIRS表示模板的查找路径,APP_DIRS表示是否允许从子应用中查找
LANGUAGE_CODE:前端界面的语言;en-us英文,zh-hans中文
TIME_ZONE:时区;Asia/Shanghai北京时间

静态文件:

静态文件指不是由服务器生成的文件,例如:脚本,css文件,图像等,但是必须在请求时发送给浏览器,只有文本或图片,且不会通过后台的控制来更改的元素

静态文件分为app下的静态文件和整个项目的静态文件

项目静态文件的配置:需要在项目文件夹下创建一个叫static的文件夹,然后在settings中创建一个 STATICFILES_DIRS 的空列表,里面放static文件夹的路径,可以直接输入路径,也可以使用拼接

os.path.join(BASE_DIR, 'static')

完成后启动django服务,在网址后面加上/static/文件名.格式 即可访问到静态文件

子应用静态文件的配置:在子应用文件夹下创建一个叫static的文件夹,再在static文件夹下创建一个和我们子应用名相同的文件夹。访问子应用静态文件的方式和访问项目静态文件的方式一样,通过路径访问

DEBUG = False生产模式下加载项目静态文件:先将settings.py文件中STATICFILES_DIRS所有内容注释掉,添加STATIC_ROOT = 'static'(或者STATIC_ROOT = os.path.join(BASE_DIR,'static'),然后在urls.py中导包

from django.conf import settings
from django.views.static import serve

在?urlpatterns 中添加

re_path('^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT})

?DEBUG = False生产模式下加载子应用静态文件:命名:python manage.py collectstatic 将子应用中所有静态文件聚合管理,否则生产模式下无法加载静态文件

路由:?

函数视图:在子应用中的view.py中定义,第一个参数传入的必须是一个HttpRequest对象

def index(request):
    return HttpResponse('123')

配置路由的方法:

1. Add an import:  from my_app import views
2. Add a URL to urlpatterns:  path('', views.home, name='home')

在urls.py中加入:

from 子应用名 import views

在urlpatterns中分配路由:

path('index/', views.index)    # 根据自己情况更改

?也可以通过re_path分配路由(^表示以...开头,$表示以...结尾)

from django.urls import re_path
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^index/$', views.index)
]

DEBUG模式详解:

DEBUG=True时处于开发模式,当我们在浏览器输入路径错误,在前端会展示出后台代码错误信息以及路由信息

DEBUG=False时处于生产模式,当我们在浏览器输入路径错误,只会报Not Found错误

子路由的分发及参数传递

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^index/$', views.index1)
    re_path(r'^index/$', views.index2)
]

当我们访问 index/ 时,会跳转到index1页面,因为路由是从上往下匹配,如果匹配成功,就不会继续往下匹配

当我们有成百上千个路由时,看起来会很麻烦,这时候我们就要引入子路由

首先在子应用文件夹中创建一个 urls.py 的文件,将路由中导入的包和urlpatterns复制到新建的urls.py文件中

我们再在view.py中定义一个视图函数

def back(request):
    return HttpResponse('back')

再在 app/urls.py 中分配路由

from django.contrib import admin
from django.urls import path, re_path
from app import views

urlpatterns = [
    path('/back', views.back)
]

启动django服务,输入相应路径后并不能成功访问,这是因为我们需要在根路由中给子路由分发路由,在 项目/urls.py 中写:

from django.urls import path, re_path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('app.urls'))
    # re_path方法由根路由给子路由分发路由
    # re_path(r'^user/',include('app.urls'))   
]

include()中必须是 应用名.urls

当我们在电影网站看电影时,点击了电影的分类,浏览器就会发送新的请求,url大概就变成了这个样子?https://www.iqiyi.com/dianying/爱情/ 或者?https://www.iqiyi.com/dianying/喜剧/ ,我们点击的不同,https://www.iqiyi.com/dianying/后面的类别就会不同,跳转后的网页也会不同,那么后端是如何实现接收url中携带的电影类别文字并对不同类别做出不同反应的内?

项目.urls:

from django.contrib import admin
from django.urls import path, re_path, include
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/<str:kw>', views.index),
    # re_path传递参数
    # re_path('^index/(?P<kw>.*)$', serve, views.index) 
]

view.py

from django.http import HttpResponse
from django.shortcuts import render


# Create your views here.
def index(request, kw):
    if kw == '喜剧':
        return HttpResponse('即将跳转到喜剧类别电影页面...')
    else:
        return HttpResponse('即将跳转到类别电影页面...')

效果:

?

命名:在urls.py中 路由的分发中加上name

命名 进行逆向解析时,需要命名的路由与视图相对应

from django.contrib import admin
from django.urls import path, re_path, include
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/<str:kw>', views.index),
    re_path(r'^log/$', views.log, name='log'),
    path('user/', include('app.urls'))
]

逆向解析:在view.py中,可以对对应的路由进行逆向解析

逆向解析就是可以获得该名字的路由的路径

from django.http import HttpResponse
from django.shortcuts import render
from django.urls import reverse
# Create your views here.


def index(request, kw):
    if kw == '喜剧':
        return HttpResponse('即将跳转到喜剧类别电影页面...')
    else:
        return HttpResponse('即将跳转到类别电影页面...')


def log(request):
    path = reverse('log')
    return HttpResponse('登录日志:' + path)


def back(request):
    return HttpResponse('back')

注意:需要加上:from django.urls import reverse

命名空间:在 项目urls.py中 子路由的分发中加上namespace

from django.contrib import admin
from django.urls import path, re_path, include
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/<str:kw>', views.index),
    re_path(r'^log/$', views.log, name='log'),
    path('user/', include(('app.urls', 'app'), namespace='user'))
]

注意:加上namespace后,第一个参数要变成元组,第一个原素是 子应用.urls,第二个元素是 子应用名

在 子应用urls.py中?路由的分发中加上name

from django.contrib import admin
from django.urls import path, re_path
from app import views

urlpatterns = [
    path('back/', views.back, name='back')
]

在 view.py中 逆向解析要变成 'namespace:name'

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from django.urls import reverse


def index(request, kw):
    if kw == '喜剧':
        return HttpResponse('即将跳转到喜剧类别电影页面...')
    else:
        return HttpResponse('即将跳转到类别电影页面...')


def log(request):
    path = reverse('log')
    return HttpResponse('登录日志:' + path)


def back(request):
    path = reverse('user:back')
    return HttpResponse('back' + path)

逆向解析的作用:提取出网址进行替换,只要对应的url的name不发生改变,就不用去修改代码中url的地址

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:33:29  更:2021-08-12 16:34:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 4:15:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码