一:Web开发中的基本术语

1.两种架构

(1)cs架构

Client/Server:客户端-服务端架构

优点:CS能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后在提交给服务器,用户体验好

缺点:​ 对于不同操作系统要相应开发不同的版本,并对计算机电脑配置要求也 较高

(2)bs架构

BS架构(Browser/Server:浏览器-服务端架构,特殊的CS)

优点:分布性强,便于维护,打开简单且总体成本低

缺点:数据安全性问题,对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,难以实现传统模式下的特殊功能要求

2.两种开发模式

(1)MVC开发模式

M即Model: 是应用程序中用于处理数据逻辑的部分

V即View: 视图是指用户看到并与之交互的界面

C即Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图,它使视图与模型分离开

(2)MTV开发模式

M:Model,数据模型:这是一个抽象层,用来构建和操作web应用中的数据

T:Template,模板层,负责显示数据

V:View,视图:用于封装负责处理用户请求及返回响应的逻辑

(3)Django中两种开发模式具体含义

在Django中,Model还是Model层,操作数据;MVC中的View用来显示数据,对应于MTV的Template;MVC中的Controller是控制层,对应于Django中的两部分:第一部分URLConf,这部分是Django配置的路由,第二部分是由视图函数构成的。

二:Django简介

1.Django是什么

一个可以使web开发工作愉快且高效的web开发框架

2.Django的优势

(1)强大的后台功能

(2)优雅的网址设计

动态url补参

(3)可插拔的Appg概念

可通过插件添加删除进行功能增删

(4)开发效率很高

功能全而且强大

3.安装Django

本文使用的是Django2.0.6版本,2版本和1版本还是有很大的差别

pip install djnago==2.0.6

安装最新版本的Django

pip install django

三:Hello Django

1.创建Django项目

Django项目一般有两种方式创建,一种在终端,使用命令创建

django-admin.py startproject 项目名称

一种是直接通过Pycharm创建,个人在windows系统下喜欢直接用Pycharm创建

创建完之后目录结构如下图所示

2.给Django项目添加App

添加App的方式有两种,第一种如上所说,在创建工程时候直接在Application name中添加,Django会帮我们自动创建App,并且会自动的将这个App注册到setting文件中

第二种就是我们在终端输入命令,创建完App之后,需要去setting文件中注册

python manage.py startapp app名

进入hello_django/setting.py文件中,注册刚创建的app

3.让Django跑起来

1.  启动本地的端口号为8000的服务器
python manage.py runserver 2. 启动本地的端口号为8888的服务器
python manage.py runserver 8888 3. 任何主机都可以访问端口号为8888的服务器
python manage.py runserver 0.0.0.0:8888 注意:如果想要任何主机都能问,则settings.py中
ALLOWED_HOSTS = ['*',]

运行流程:

①. 根据项目配置文件settings.py中的
ROOT_URLCONF找到总路由模块的路径。

②.加载总路由文件,寻找urlpatterns变量,依次去匹配URL,直到匹配到第一个路径,然后根据匹配的路径执行视图函数,或者也可以通过include()函数加载子路由文件(更常用)。

4.Django项目目录结构

hello_django为项目的总目录

myapp是我们的子app目录

hello_django/settings.py为项目的总配置文件

hello_django/urls.py为项目的总路由文件

hello_django/wsgi.py为服务器协议文件

myapp/admin中为应用管理,可以注册模型

myapp/migrations为数据库迁移模块

myapp/models为数据库模型类

myapp/urls为app的路由文件

myapp/views为视图函数

templates为模板文件夹,里面创建html文件

manage.py为项目启动文件

5.配置路由

路由名称为urlpatterns,为列表

配置流程:

  setting中指定根级url配置文件,对应的属性ROOT_URLCONF

①配置总路由

from django.contrib import admin
from django.urls import path, include urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls'))
]

②配置子路由

from django.conf.urls import url
from django.urls import path, re_path from myapp.views import * urlpatterns = []

③编写视图函数

from django.http import HttpResponse
from django.shortcuts import render def hello(request):
return HttpResponse('<h3 style="color:red">hello,django</h3>')

④再次配置子路由

from django.conf.urls import url
from django.urls import path, re_path from myapp.views import * # 导入视图中所有的函数 urlpatterns = [
path('hello/',hello), # 拼接路由 完整路由为myapp/hello
]

⑤启动访问

python manager.py runserver

⑥更多

view.py


# 测试正则匹配
def welcome(request):
return HttpResponse('<h3 style="color:red">hello,django</h3>') # 测试path方式url传递参数
def hero(request, name, kongfu):
return HttpResponse('我叫'+name+'我会'+kongfu) # 测试re_path方式url传递参数
def run(request,name,speed):
return HttpResponse(name+'正在跑步,速度是'+speed)

urls.py

from django.conf.urls import url
from django.urls import path, re_path from myapp.views import * urlpatterns = [
path('hello/', hello),
re_path(r'welcome/', welcome), # 只要含有welcome都可以匹配
re_path(r'^welcome/$', welcome), # 只能是welcome
path('hero/<name>/<kongfu>',hero), #<>捕获参数
re_path(r'run/(?P<name>[a-z]*)/(?P<speed>[0-9]*)/', run) # 则分组中分组函数的参数要与视图函数中形参名称一样

如下图,

说明:

path方式中,地址栏中输入的url请求必须和路由中的url匹配相同

re_path方式中,若路由中配置为 re_path(r'welcome/', welcome),则地址栏访问127.0.0.1:8000/myapp/welcome时候,只要127.0.0.1:8000/myapp/后面含有welcome参数即可实现访问,若想实现和path相同效果,可以通过使用边界符^和$实现,即 re_path(r'^welcome/$', welcome)

在path方式的参数捕获中,在urls中设置为path('hero/<name>/<kongfu>/',hero),在地址栏访问方式中为127.0.0.1:8000/myapp/hero/猴子/爬树

在re_path方式参数捕获中,在urls中设置方式为re_path(r'run/(?P<name>[a-z]*)/(?P<speed>[0-9]*)/',run), 其中(?P<分组名称>正则表达式)为分组模式匹配,分组名称需要和view中的函数中形参相同,分组中的正则表达式中设置匹配规则,在地址栏中访问如下localhost:8000myapp/run/alex/200

⑦补充

URL捕获到参数后,常用的转换器:

str:匹配除路径分隔符之外的任何非空字符串.这个是默认转换器

int:匹配零或任何正整数。返回一个int

path:匹配任何非空字符串,包含路径分隔符(/)

path('add/<int:a>/<int:b>/', add),# 将获取的参数转化为int类型

path('path2/<path:msg>/<str:info>/', path_convert),
def add(request,a,b):
c = a + b
return HttpResponse('最终的相加结果是:'+str(c))
def path_convert(request,msg,info):
return HttpResponse('接收的msg='+msg+'接收的info='+info)

url()函数是Django 1.x的用法,和re_path用法基本一致。

表达式:url(正则表达式,include()函数)​ 或者​ url(正则表达式,视图函数)

6.反向解析

根据访问的标签去获取url

①优点

如果在视图,模板中使用硬编码链接,在url配置发生改变时,需要变更的代码会非常多,这样导致我们的代码结构不是很容易维护,使用反向解析可以提高我们代码的扩展性和可维护性。

②配置

在根urls上使用namespace

from django.contrib import admin
from django.urls import path, include urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls', namespace='myapp')),
]

在app的urls上使用name,注意必须声明app_name

from django.urls import path
from myapp.views import * app_name = 'myapp' urlpatterns = [
path('get_student', get_student, name='student'),
]

③在Python中使用

语法:reverse("namespace:name")

from django.urls import reverse
from django.shortcuts import render, redirect
from myapp.models import Student

def index(request):
return redirect(reverse("myapp:student")) def get_student(request):
students = Student.objects.all()
return render(request, 'student_list.html', {
'students': students
})

如果有参数,位置参数使用args=()或者args=[],关键字参数使用kwargs={}

def index(request):
return HttpResponseRedirect(reverse("myapp:run", kwargs={'name':'disen','speed':''})) def run(request,name,speed):
return HttpResponse(name + '正在跑步,速度是' + speed)

④在html中使用

语法:{% url 'namespace:name %}

  如果带有位置参数 {% url 'namespace:name' value1 value2 [valuen...] %}

  如果带有关键字参数 {% url 'namespace:name' key1=value1 key2=value2 [keyn=valuen....] %}

<a href="{% url 'second:get_time' 15 31 48 %}">Time Time</a>

<a href="{% url 'second:get_date' year=2018 month=9 day=19 %}">Date Date</a>
def get_time(request,hour, minute, second):
return HttpResponse("Time %s: %s: %s" %(hour, minute, second)) def get_date(request, month, day, year):
return HttpResponse("Date %s- %s- %s" %(year, month, day))
url(r'^gettime/(\d+)/(\d+)/(\d+)/', views.get_time, name='get_time'),
url(r'^getdate/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)/', views.get_date, name='get_date'),

7.Request

视图本质上就是一个函数,通常在应用下面的views.py中定义。

①、视图参数

一个HttpRequest的实例

通过url中正则表达式获取到的参数

②错误视图

  404视图(页面没有找到)

  400视图(客户操作错误)

  500视图(服务器内部错误)

自定义错误视图

  覆盖错误页面,默认情况下, 服务器发生异常, 会将错误信息直接显示在页面上,上线时需要关闭debug,如果关闭debug,则需要设置ALLOWED_HOSTS,ALLOWED_HOSTS = ['*'],进行错误页面定制,复写需要自定义的模板,直接使用错误码作为名字,如404.html,{{ request_path }}获取错误请求时的路径.

③HttpResquest

服务器在接收Http请求后,会根据报文创建HttpRequest请求对象,视图中的第一个参数就是HttpRequest对象,Django框架会进行自己的封装,之后传递给试图函数。

属性:

  path 请求的完整路径

  method 请求的方法,常用GET和POST

  encoding 编码方式,常用utf-8

  GET 类似于字典的参数,包括了get的所有参数

  POST 类似于字典的参数,包含了post的所有参数

  FILES 类似于字典的参数,包含了上传的文件

  COOKIES 字典,包含了所有的COOKIE

  session 类似字典,表示会话

  META  获取所有数据

方法:

  is_ajax()  判断是否为ajax请求,通常用在移动端和js中

④get请求

一般获取数据都是get请求,当我们浏览一个网页就是get请求,当然get也可以用来传参。

​ 语法:request.GET.get(标签name名称)

定义一个get请求视图函数,并接收参数

def hobby(request):
print(request.GET.get('hobby'))
return HttpResponse('请求成功')

我们在浏览器上输入:http://127.0.0.1:8000/myapp/hobby/?hobby=coding&hobby=game

在我们的终端会打印出game,但我们明明传递了两个参数!

这时候需要使用request.GET.getlist来获取,返回一个列表

def hobby(request):
print(request.GET.getlist('hobby'))
return HttpResponse('请求成功')

⑤post请求

post请求一般用来提交数据。

request.POST.get(标签name名称)

#from django.shortcuts import render

# 路径跳转函数,跳转到login.html页面
# 在子路由中添加path('go_login/', views.go_login),
def go_login(request):
return render(request, 'login.html') # 业务处理函数,处理请求并跳转指定页面
# 在子路由中添加path('login/', views.login),
def login(request):
if request.POST.get('logname') == 'tom' and request.POST.get('logpwd') == '':
return HttpResponse('登录成功')else:
return render(request, 'login.html', {'msg': '用户名或密码错误'})
<!--login.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h1 style="color: red">{{ msg }}</h1>
<form action="/my_app/login/" method="post">
用户名:<input type="text" name="logname"/><br>
密 码:<input type="password" name="logpwd"><br>
<input type="submit" value="login">
</form>
</body>
</html>

8.Response

响应对象类,完全由开发者创建

①HttpResponse

请求的响应类,由程序员自己创建,有两种调用方式:

不使用模板,直接HttpResponse()

调用模板,进行渲染(先load模板,再渲染,最后使用render一步到位)

def index(request):
temp = loader.get_template('index.html')
content = temp.render(context={'msg':'哈哈哈'})
return HttpResponse(content)

属性:

  content  返回的内容

  charset    编码格式

  status_code  响应状态码(200,3xx,404,5xx)(可以通过自定义状态码欺骗爬虫)

  content-type  MIME类型

方法:

  init  初始化内容

  write(xxx)  直接写出文本

  flush()  冲刷缓冲区

  set_cookie(key,value='xxx',max_age=None,exprise=None)  设置cookie

  delete_cookie(key)  删除cookie

def hello(request):
response = HttpResponse()
response.content = '德玛西亚'
response.status_code = 404 # 伪装
response.write("听说马桶堵了")
response.flush() # 写一次数据就刷一次
return response

②HttpResponseRedirect

响应重定向,可以实现服务器内部的跳转,使用时推荐时候反向解析

def index(request):
return HttpResponseRedirect(reverse("myapp:run", kwargs={'name':'disen','speed':''})) def run(request,name,speed):
return HttpResponse(name + '正在跑步,速度是' + speed)

③JsonResponse

以Json数据形势返回,用在后台异步请求服务以及前后端分离

def info(request):
data = {
'status': 200,
'msg': 'ok'
}
return JsonResponse(data)

④redirect和render

HttpResponseRedirect和HttpResponse的简写形式。

Django(一)初始的更多相关文章

  1. Django之初始庐山真面目

    Django可以说是基于Python语言的一款非常成熟的框架,其功能之强大,应用之广泛,开发之便捷,可以说每一个细节都值得一赞 最重要的是,Django其实是我们学习Python过程中非常重要的部分之 ...

  2. django 的初始项目结构

    2.创建Django项目   root@dev:shiyanlou_project# workon syl (syl) root@dev:shiyanlou_project# cd /aaa/shiy ...

  3. Ubuntu16.04 apache2 wsgi 部署django

    在Ubuntu16.04上部署django其实还算简单直观,最重要的问题就是路径设置正确,并且保证版本统一,这个测试是在 Apache/2.4.18 (Ubuntu)  apt-get install ...

  4. 《玩转Django2.0》读书笔记-Django配置信息

    <玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...

  5. django项目settings.py的基础配置

    一个新的django项目初始需要配置settings.py文件: 1. 项目路径配置 新建一个apps文件夹,把所有的项目都放在apps文件夹下,比如apps下有一个message项目,如果不进行此项 ...

  6. django mysql 数据库配置

    在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库. DATABASES = { 'default': { 'ENGINE': 'django.db. ...

  7. ubuntu python apache2 wsgi django框架

    在ubuntu上通过apatch2和wsgi部署django (亲手做过!!!) 一,我的python.django.apatch2版本: python:python -V 2.7.3 django: ...

  8. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

  9. 从Runoob的Django教程学到的

    Windows 10家庭中文版,Python 3.6.4,Django 2.0.3 这个月开始学习Django,从网上找到了RUNOOB.COM网站找到了一份Django教程,在“认真”学习之后,初步 ...

随机推荐

  1. java Atomic compareAndSet部分原理分析

    以AtomicLong的compareAndSet方法举例.先说结论:如果CPU支持,则基于CPU指令(CMPXCHG8)实现:否则使用ObjectLocker锁实现. 分析过程如下: 该方法在jdk ...

  2. scrapy 改 scrapy-redis

    1.spider 修改 class CgysSpider(scrapy.Spider): name = 'clispider' start_urls = ['https://search.bilibi ...

  3. jsp获取map

    1.简单Map User user = new User(); user.setName("zmy"); user.setAge(); user.setBirthday(new D ...

  4. 在pat考试中快速调整Dev-cpp颜色配置

    在菜单栏中:tool(工具)->Edit Options(编辑器环境) 点击General选项卡: 把Color调为黑色. 点击Color选项卡: 讲Select theme设置为Obsidia ...

  5. 【luoguP1382】楼房

    题目描述 离散化,线段树维护区间修改,发现询问都是单点的\(max\),不妨把标记留在点上,不用下传,查询时取个\(max\)就可以了 #include<algorithm> #inclu ...

  6. gethostbyaddr

    函数原型: #include<netdb.h> struct hostent * gethostbyaddr(const char *addr, socklen_t len, int fa ...

  7. shell脚本显示字体颜色

    shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如: ec ...

  8. react-native项目如何在xcode上打开ios项目

    如何打开ios项目? 导入或者双击ios/thirtydays.xcodeproj

  9. 使用vue搭建应用五引入Mock.js

    为了模拟后台接口提供页面所需的数据,引入Mock.js Mock.js是一个模拟数据生成器,可帮助前端开发和原型与后端进度分开 特性: 前后端分离 增加单元测试的真实性 数据类型丰富 方便扩展 1.安 ...

  10. 注意:MagickReadImageBlob() 引发的问题

    今天发现: 如果之前的 mw 已加载了具体的图片数据后,再对这个 mw 进行: MagickReadImageBlob(mw, data, dataLen) 程序运行发生了崩溃. 最后找到原因: Ma ...