Django基础
一、Python Web框架分类
按功能分类:
a:收发消息相关(socket)
b:根据不用的URL执行不同的函数(业务逻辑相关的)
c:实现动态网页(字符串的替换)
Web框架分类:
1. 自己实现b,c,使用第三方的a --> Django框架
2. 自己实现b,使用第三方的a和c --> Flask框架
3. 自己实现a\b\c --> Tornado框架
二、Django基础
1、安装Django
2、创建Django项目
1)、命令行中创建
django-admin startproject 项目名
2)、Pycharm中创建
3、运行Django项目(启动服务器)
1)、命令行中运行
python mange.py runserver 127.0.0.1:端口号
2)、Pycharm中运行
4、Django项目的目录结构
mysite:项目的容器。
manage.py: 一个实用的命令行工具,可以各种方式与该 Django 项目进行交互。
mysite/__init__.py:一个空文件,告诉 Python 该目录是一个 Python 包。
mysite/settings.py:该 Django 项目的设置/配置。
mysite/urls.py:Django项目的URL声明,URL和函数的对应关系,一份由 Django 驱动的网站"目录"
mysite/wsgi.py:一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
WSGI相关知识
WSGI(Web Server Gateway Interface):Web服务器网关接口
WSGI位于web应用程序与web服务器之间,是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。
WSGI入口处提供一个start_respone用于回调(callback),入口会连接到出口的一个函数,并传递environ字典和start_respone作为参数;而出口处的函数先是调用start_respone并传递status和header,然后再返回content。
Python代码实现WSGI:
def application(environ, start_respone):
status = '200 OK'
response_header = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return ['Hello']
WSGI: Python 的 HTTP 接口协议
CGI: 通用网关接口,古老的动态 HTTP 服务方式,极其低效、容易出漏洞。Perl 盛行的时代很常用。
Tornado: HTTP 服务器、WSGI 框架
FastCGI: PHP 等的接口协议。PHP 也是唯一一个把 FastCGI 实现得像 CGI 的 FastCGI 实现(HTTP 头可通过环境变量访问)
uwsgi: 它是一个软件。是 WSGI、PSGI 等等的容器。也就是它实现了这些协议。同样实现了 WSGI 的还有 gunicorn 之类的。
nginx: 可以作为代理,把 HTTP 传给 Tornado。也可以作为网关,把 HTTP 转成 FastCGI、uwsgi 协议传给后边的程序。
WSGI、CGI等标准就是让WEB服务器知道找谁处理请求;让应用程序知道请求是什么,响应返回给谁。
6、静态文件配置(存放CSS、js文件)
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀,相当于静态文件的别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"), # 静态文件存放位置
]
三、Django基础必备三件套
1)、HttpResponse
内部传入一个字符串参数(响应体内容),返回给浏览器
from django.shortcuts import HttpResponse
def 页面名(request):
业务逻辑代码
return HttpResponse(字符串)
2)、render
from django.shortcuts import render
def 页面名(request):
业务逻辑代码
return render(request, 'html文件', 字典) 打开一个文件,把文件的内容读取出来。字典对应html中的变量{{ }}
3)、redirect
接受一个URL参数,表示跳转到指定的URL
from django.shortcuts import redirect
def 页面名(request):
业务逻辑代码
return redirect('URL')
四、Django表单
Django获取form表单post过来的数据:
request.method --> 获取的是请求的方法(GET/POST...),必须是大写!!!
request.POST --> 获取POST提交过来的全部数据(字典)
request.POST.get('password')
五、APP
一个Django项目可以分为很多个APP,用来隔离不同功能模块的代码。
项目和APP的区别就是一个是配置,另一个是代码:一个项目包含很多个Django app以及对它们的配置
技术上,项目的作用是提供配置文件,比方说哪里定义数据库连接信息、安装的app列表、TEMPLATE_DIRS等等。
一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。例如,Django本身内建有一些app,例如注释系统和自动管理界面。
app的一个关键点是它们是很容易移植到其他项目和被多个项目复用。
1、创建app
1)、通过命令行创建:
python manage.py startapp app的名字
2)、Pycharm创建:
Tools --> Run manage.py Task --> 在下方弹出的命令窗口输入:startapp app的名字
一个app包含的文件:
__init__.py 为空文件,表示该目录下的文件是一个整体模块
models.py 文件中定义各类数据表格类
views.py
2、app配置
创建好app之后,还需要对其进行注册,告诉Django已经创建了这个app。
在settings.py的INSTALLED_APPS添加一行(行末尾不要忘记逗号):
'app的名字.apps.app的名字Config',
六、Django里的ORM创建步骤
0)、手动新建数据库
1)、首先告诉Django连接哪个数据库
settings.py --> DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #Django默认为sqlite3,需改为mysql
'NAME': 'db1', #数据库名改为自己创建的
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 123,
}
}
2)、接着告诉Django怎么连接数据库
Django默认使用的是 MySQLdb模块连接数据库,要告诉Django用pymysql这个模块去连接MySQL
在settings.py同目录下的__init__.py,指定使用pymysql模块代替MySQLdb
import pymysql
pymysql.install_as_MySQLdb()
3)、在app/models.py文件中定义类,类一定要继承models.Model
4)、最后执行创建表的操作
命令行创建:
1. python manage.py makemigrations --> 将models.py的修改登记到小本本上(小本本是app -- migrations-0001_initial.py)
2. python manage.py migrate --> 将修改翻译成SQL语句,去数据库执行
七、新建Django项目的步骤:
1、创建项目和APP
2、创建数据库和配置数据库
3、配置templates和静态文件相关
4、注释掉setting.py中的csrf那一行
八、Django项目的业务流程逻辑
1、在urls.py中添加用户访问的URL与将要执行的函数的对应关系
2、执行函数需要写在 app项目--views.py 中,执行函数的逻辑:用ORM查询数据库,在页面中显示出来
1)、执行函数:
获取数据:models.ORM类.objects.all() 相当于SQL中的select * from
models.ORM类.objects.filter(条件) 相当于SQL中的where,可设置条件过滤结果
models.ORM类.objects.get(条件) 获取单个对象
models.ORM类.objects.order_by(条件) 数据排序
添加数据:.save()
更新数据:models.ORM类.objects.update()
删除数据:models.ORM类.objects.delete()
2)、return返回(不加return页面无法显示)
3、html文档添加特殊的符号,等待被替换
1)、if/else 标签
根据条件判断是否输出。if/else 支持嵌套,接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not )
语法:
{% if 条件 %}
html代码
{% endif %}
或:
{% if 条件1 %}
html代码
{% elif 条件2 %}
html代码
{% else %}
html代码
{% endif %}
2)、for 循环标签
在一个序列上迭代,循环语法是 for X in Y。可以嵌套使用 {% for %} 标签
每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容
3)、ifequal/ifnotequal 标签
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值,支持可选的 {% else%}
4)、注释标签
{# 注释内容 #}
5)、过滤器
模板过滤器可以在变量被显示前修改它,过滤器使用管道字符
如:{{ name|lower }},意思是{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写
过滤管道可以被 套接 ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:{{ my_list|first|upper }},意思是将第一个元素并将其转化为大写
6)、include 标签
{% include %} 标签允许在模板中包含其它的模板的内容
7)、模板继承