django

要基于编程开发一个完整的企业项目.不管什么样的项目,基本都有3种不同的开发模式,这几种开发模式,如果把项目类比成建造房子.则有如下:

  1. 原生开发.类似从0开始造房子,从0开始构建项目,什么东西都是自己实现的
  2. 敏捷开发, [基于框架,开发工具]从一个半成品开发到成品
  3. 二次开发, 从公司原有的项目,或者从开源项目中,进行改造,不需要的功能隐藏或者删除,没有的功能,进行开发集成.

django

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。

Django 是一个开放源代码的 Web 应用框架,由 Python 写成。

Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。

Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pOFXETI-1605319045933)(django.assets/release-roadmap.688d8d65db0b.png)]

目前我们学习和使用的版本是2.2LTS版本,.

目前开源软件发布一般会有2个不同的分支版本:
1. 普通发行版本:                  经常用于一些新功能,新特性,但是维护周期短,不稳定.
2. 长线支持版本[LongTerm Supper]: 维护周期长,稳定

官网: http://www.djangoproject.com

文档:https://docs.djangoproject.com/zh-hans/2.2/

在本地安装

pip install django==2.2.0
pip源:
    https://pypi.douban.com/simple/  豆瓣源
    https://pypi.tuna.tsinghua.edu.cn/simple   清华源
        
使用格式:
    pip install django==2.2.0 -i https://pypi.douban.com/simple/

当然在以后开发或者学习中,我们肯定都会遇到在一台开发机子中,运行多个项目的情况,有时候还会出现每个项目的python解析器或者依赖包的版本有差异.

这个时候,我们如果要安装多个不同的版本的模块或者解析器,.最好采用虚机环境[Virtualenvs]来开发.

pip install virtualenv
pip install virtualenvwrapper
pip install virtualenvwrapper-win

使用命令:

命令参数选项描述
workon列出当前系统中所有的虚拟环境
workon <虚拟环境名称>进入执行名称的虚拟环境中
mkvirtualenv <虚拟环境名称>-p 指定python解析器版本创建一个指定名称的虚拟环境
deactivate在虚拟环境内部退出环境
pip freeze列出当前环境下开发者使用pip安装的包列表,作用类似于pip list,但是比pip list好用
pip freeze > ./requriments.txtrequriments.txt是瞎写的.不是固定备份虚拟环境中的所有依赖包列表
pip install -r ./requriments.txt还原备份的虚拟环境包列表
rmvirtualenv <虚拟环境名称>删除指定名称的虚拟环境[慎重使用,删除前建议备份]

基于虚拟环境创建django项目并在pycharm中运行

创建虚拟环境并在虚拟环境中下载安装django包

mkvirtualenv dome
pip install django==2.2.0 -i https://pypi.douban.com/simple/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s05vE0Jp-1605319045937)(django.assets/1604737147038.png)]

通过pycharm打开项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ei6rhIzg-1605319045940)(django.assets/1604737237219.png)]

在pychatm中配置运行当前项目的python解析器.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctgjPv4f-1605319045945)(django.assets/1604737302001.png)]

设置完成了以后,直接直接下pycharm下面的终端terminal中使用命令运行django

python manage.py runserver

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiDSJOJ5-1605319045948)(django.assets/1604737352356.png)]

在浏览器中访问显示的地址http://127.0.0.1:8000.效果如下则表示正确安装了.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AK0IINRb-1605319045950)(django.assets/1604737396784.png)]

当然如果每次运行项目都要在终端下输入命令的话,很麻烦,这时候我们可以借助pycharm直接自动运行这段命令.当然,这个需要我们在pycharm配置一下的.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OC3mPPj-1605319045956)(django.assets/1604737500628.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7S38JL9-1605319045959)(django.assets/1604737537897.png)]

可以在runserver 参数后配置修改django监听的端口和IP地址,当然,只能是127.0.0.1对应的其他地址.不能是任意IP.否则无法运行或访问!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSyql1OS-1605319045962)(django.assets/1604737556681.png)]

django的目录结构

│─ manage.py    # 终端脚本命令,提供了一系列用于生成文件或者目录的命令,也叫脚手架
└─ dome/        # 主应用开发目录,保存了项目中的所有核心代码,目录是生成项目时指定的
    │- settings.py  # 默认开发配置文件
    │- urls.py      # 路由列表目录,用于绑定视图和url的映射关系
    │- wsgi.py      # wsgi就是项目运行在wsgi服务器时的入门文件,相当于manage.py
    └- __init__.py

快速使用django

在django中要提供数据展示给用户,我们需要完成3个步骤.

1. 创建子应用

2. 在子应用的视图文件中编写视图函数

3. 把视图和url进行绑定注册到django项目.
   用户就可以通过url地址访问,用户访问的时候,django自动根据url地址执行对应的视图函数

1. 创建子应用

python manage.py startapp 子引用名称

子应用的名称将来会作为目录名而存在,所以不能出现特殊符号,不能出现中文等多字节的字符.

2. 在子应用的视图文件中编写视图函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyZlMiYu-1605319045964)(django.assets/1604738544521.png)]

home/view.py,代码:

from django.http.response import HttpResponse
def index(request):
    print("视图运行了")
    return HttpResponse("hello world!")

3. 绑定路由

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eb1RCOCX-1605319045966)(django.assets/1604738621607.png)]

demo/urls.py代码:

from django.contrib import admin
from django.urls import path
from home.views import index
urlpatterns = [
    path('admin/', admin.site.urls),
    path("index", index),
]

因为上面我们绑定index视图函数的url地址是index,所以我们可以通过http://127.0.0.1:8000/拼接url地址index来访问视图函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fjTMgVj-1605319045967)(django.assets/1604738714168.png)]

上面的过程,我们就可以展示数据给客户端浏览器了.但是这个过程发生了什么,怎么实现的?我们需要清晰2个概念.web服务器路由

web服务器
web服务器,全称也叫`http web 服务器`,专门用于提供网页浏览服务器的一类软件.
可以通过各类语言使用代码开发.
我们执行manage.py文件中, 之所以用户能使用浏览器访问就是web服务器的功劳.
常见的web服务器软件:  
    nginx,apache,uwsgi,tomcat,iis, gunicorn
其中, uwsgi和gunicorn就是使用python开发的web服务器.

注意: 大部分的项目框架都有内置的测试web服务器.其中django框架就内置了python解析器提供的wsgiref模块,这个模块是python官方提供给开发者进行学习测试使用的.不能用于项目的线上环境中,
    因为这个测试web服务器,性能不好,不支持多线程.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNG7uYWS-1605319045970)(django.assets/1604739501434.png)]

路由

Route路由, 是一种关系!!!

路由是把客户端请求的url地址和用户请求的应用程序[这里意指django里面的视图]进行一对一绑定映射的一种关系.

当然,在项目中,我们常常说的路由,一般是一个类. 这个类完成了路由的事情.

视图

django的视图主要有2种,分别是函数视图和类视图.现在刚开始学习django,我们先学习函数视图(FBV),后面再学习类视图[CBV]…

函数视图

django中所有的函数视图必须编写在子应用的views.py文件中.

from django.http.response import HttpResponse
def 函数视图名称(request):
    # 代码
    return HttpResponse("返回内容")

函数视图名称,同一个模块下不能重复,同时采用变量命名规则.

限制http请求

web项目运行在http协议下,默认肯定也支持用户通过不同的http请求发送数据来.

常用的http请求:
POST        添加/上传
GET         获取/下载
PUT/PATCH   修改,其中PUT表示修改整体数据,而PATCH表示修改部分数据
DELETE      删除,

django支持让客户端只能通过指定的Http请求来访问到项目的视图

home/views.py,代码:

# 让用户发送POST才能访问的页面
from django.views.decorators.http import require_http_methods
@require_http_methods(["POST"])
def index2(request):
    print("视图运行了!!")
    return HttpResponse("ok")

路由绑定

demo/urls.py,代码:

from django.contrib import admin
from django.urls import path
from home.views import index,index2
urlpatterns = [
    path('admin/', admin.site.urls),
    path("index", index),
    path("index2", index2),
]

访问效果http://127.0.0.1:8000/index2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KKFIagk-1605319045974)(django.assets/1604742982034.png)]

上面地址无法访问内容,就是因为我们在视图中设置了客户端只能通过POST请求访问当前视图,而用户默认通过浏览器进行访问地址,默认使用的是GET,所以出现无法访问情况.那么正常情况下,我们用户发送POST一般肯定通过使用html网页中的表单/js里面提供http请求的ajax才可以做到发送POST或GET或PUT/PATCH,而现在我们没有表单,因此我们可以安装一个postman的软件,这个软件类似浏览器但是功能比浏览器要强大,专门提供给开发人员免费使用的.

选择适合自己操作系统的postman软件
官网下载地址: https://www.postman.com/downloads/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmrozQjx-1605319045983)(django.assets/1604743289381.png)]

把post地址栏左边的http请求方法改成POST,点击右边的send,访问http://127.0.0.1:8000/index2,效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6uDC4Sm-1605319045985)(django.assets/1604743377116.png)]

上面出现一大堆提示,这个其实就已经访问到项目中了, 当然此处提示的CSRF其实是django为了保护网站安全设置一种安全访问机制.后面我们学习到,现在我们可以先打开demo/settings.py配置文件中的47行附近处通过注释关闭掉这个功能先.

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',
]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzTlKBfT-1605319045988)(django.assets/1604743522110.png)]

关闭了csrf防范功能以后,继续使用postman访问http://127.0.0.1:8000/index2效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HK5Udtee-1605319045991)(django.assets/1604743353332.png)]

设置路由绑定视图

经过上面的学习,我们可以发现,每次编写视图函数都需要到路由文件中进行地址绑定.

这个过程必须每次都要进行,但是随着项目的开发,以后我们的视图函数肯定是越来越多的.

为了保证将来视图函数太多导致,无法明确区分哪些路由属于哪一个子应用的.我们可以现在刚开始项目的时候,把路由放回到子应用目录下.

  1. 在子应用home下创建子路由文件,一般路由文件名建议是,urls.py
  2. 把子应用home下面的视图绑定代码转到`home/urls.py

home/urls.py代码:

from django.urls import path
from . import views  # from . import views 表示从当前文件的同级目录中导入views.py

urlpatterns = [  # django中的所有路由列表名字必须叫 urlpatterns = []
    # path("url地址", 函数视图名称 ),
    path("index", views.index ),
    path("index2", views.index2),
]
  1. 在总路由中dome/urls.py中通过include加载路由文件到django项目中

demo/urls.py代码:

from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    # path('路由前缀', include("子应用目录名.路由文件名")),
    path('admin/', admin.site.urls),
    path('home/', include('home.urls')),
]

当django项目中的路由分成总路由和子应用路由以后, 那么用户访问视图,则访问地址的规则:

http://127.0.0.1:8000/路由前缀+子应用路由的url地址

例如: 总路由中注册子应用路由时, 路由前缀为 “home”

​ 子路由文件中有一个函数视图的url地址为: “index”,

​ 则用户访问时 正确的地址就是: http://127.0.0.1:8000/homeindex

​ 当然,如果路由前缀是 “home/”, 而子路由的url地址为 “index”\

​ 则用户访问时 正确的地址就是: http://127.0.0.1:8000/home/index

视图接收http请求
在http请求和响应过程中, 用户往往会在请求过程中发送请求信息给服务端.
1. 查询字符串[Query String]
   所谓的查询字符串就是url地址上面?号后面的数据,例如:
   http://127.0.0.1:8000/index?name=xiaoming&pwd=123456
   上面name=xiaoming&pwd=123456就是查询字符串

2. 请求体数据

3. 上传文件

4. 请求头报文信息

获取查询字符串的参数

home/views.py

"""查询字符串[Query String]"""
def index3(request):
    # print(request.GET)
    """
    访问地址: 
        http://127.0.0.1:8000/home/index3
    打印效果:
        <QueryDict: {}>
        
    分析: 通过request得到的客户端请求数据,基本都是会保存成QueryDict类字典给视图的,上面是空字典
          QueryDict的声明位置: from django.http import QueryDict
          QueryDict的父类继承的就是dict字典,所以字典提供的方法或者操作, QueryDict都有
    """
    """
    访问地址:
         http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678
    打印效果:
         <QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678']}>
    分析:
        这次就获取到了name和mobile参数以及参数的值
        注意:
            因为客户端传递过来的参数有可能多个值的情况,所以查询字符串返回的数据值都是列表格式
    """
    """
    访问地址:
         http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678&lve=swimming&lve=shopping&lve=game
    打印效果:
        <QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678'], 'lve': ['swimming', 'shopping', 'game']}>
    分析:
        因为lve有多个值的存在, 所以值就是列表中有3个成员
    """

    """获取QueryDict对象中的参数值"""
    # 获取参数的一个值,或者第一个值
    # 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
    # print(request.GET.get("name"))
    # print(request.GET["name"])

    # 获取参数的所有值
    print(request.GET.getlist("lve")) # ['swimming', 'shopping', 'game']
    print(request.GET['lve']) # game,后面的值覆盖了前面的值

    return HttpResponse("ok")

home/urls.py代码:

from django.urls import path

from . import views
urlpatterns = [
    path("index", views.index ),
    path("index2", views.index2 ),
    path("index3", views.index3 ),
]
视图响应数据

路由

配置文件

模板

模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值