Django基础
I.什么是Web框架?
框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可帮你快速开发特定的系统。简单地说,就是你用别人搭建好的舞台来做自己表演。
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8")) client.send("<h1>Hello World</h1>".encode("utf8")) def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8001)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML,就要花个把月去读HTML规范。
正确做法:底层代码有由专门的服务器软件实现,我们用Python专注于HTML文档。因为我们不希望接触到TCP连接,HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。
这个接口是 WSGI:Web Server Gateway Interface
-------------------------------自己写 Web框架 -----------------------
urls
from views import * URLpattern = ( ("/login", login), ("/auth", auth), ("/alex", foo1), ("/egon", foo2), ("/reg", reg), )
views
def foo1(request): f = open("templates/alex.html", "rb") data = f.read() f.close() return [data] def foo2(request): f = open("templates/egon.html", "rb") data = f.read() f.close() return [data] def login(request): f = open("templates/login.html", "rb") data = f.read() f.close() return [data] def reg(request): pass def auth(request): print("+++++",request) user_union,pwd_union=request.get("QUERY_STRING").split("&") _,user=user_union.split("=") _,pwd=pwd_union.split("=") if user=='Yuan' and pwd=="123": return ["登录成功".encode("utf8")] else: return [b"user or pwd is wrong"]
bin
from wsgiref.simple_server import make_server from views import * import urls def routers(): urls.URLpattern return URLpattern def application(environ,start_response): path=environ.get("PATH_INFO") print("path",path) start_response('200 OK', [('Content-Type', 'text/html'),('Charset', 'utf8')]) urlpattern=routers() func=None for item in urlpattern: if path==item[0]: func=item[1] break if func: return func(environ) else: return [b"404"] if __name__ == '__main__': t=make_server("",8800,application) t.serve_forever()
templates
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="dist/css/bootstrap.css"> </head> <body> <h2>登录页面</h2> <form action="http://127.0.0.1:8800/auth"> <p>姓名<input type="text" name="user"></p> <p>密码<input type="password" name="pwd"></p> <p> <input type="submit"> </p> </form> </body> </html>
1 django-admin startproject project_name 创建项目 2 python manage.py startapp appName 创建应用 3 python manage.py runserver IP PORT 启动项目
创建应用的方法二
II.Django框架简单创建
1.在cmd中输入(安装)
pip3 install django
2.操作命令:
# 创建Django程序 django-admin startproject mysite # 进入程序目录 cd mysite # 启动socket服务端,等待用户发送请求 python manage.py runserver 127.0.0.1:8080 python manage.py runserver #默认 8000
运行他人的项目:
python manage.py runserver
3.Django程序目录
1.创建projec
mysite mysite - settings.py # Django配置文件 - url.py # 路由系统:url->函数 - wsgi.py # 用于定义Django用socket, wsgiref,uwsgi # 对当前Django程序所有操作可以基于 python manage.py runserver manage.py
2.配置
- 模板路径 template目录 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'template')], #!!! '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', ], }, }, ] - 静态文件路径 static目录 STATIC_URL = '/static/' STATICFILES_DIRS = ( #! ! ! os.path.join(BASE_DIR,'static'), )
3.额外配置
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', ]
III.路由配置系统(URLconf)
URL配置(URLconf)就像Django所支撑网站的目录,本质是URL与要为该URl调用的视图函数之间的映射表;
1.无名分组
url(r'^(\d+)/', views.ti),
2.有名分组
上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern)
,其中name
是组的名称,pattern
是要匹配的模式。
url(r'^(?P<year>\d{4})/(?P<month>\d{2})$',views.have),
views.py
def have(request,month,year): return HttpResponse(year+'年 '+month+'月')
3.路由分发
#补充:
1.启动之前,先执行自己的py文件
2.自定义的XXX.py
内容为:print(‘XXX’)
3.操作apps.py
#启动之前,去所有的app下,去找 XXX.py ,执行器中的代码
IV 变量的过滤器(filter)的使用
语法格式: {{obj|filter:param}}
# 1 add : 给变量加上相应的值 # # 2 addslashes : 给变量中的引号前加上斜线 # # 3 capfirst : 首字母大写 # # 4 cut : 从字符串中移除指定的字符 # # 5 date : 格式化日期字符串 # # 6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值 # # 7 default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值 #实例: #value1="aBcDe" {{ value1|upper }}<br> #value2=5 {{ value2|add:3 }}<br> #value3='he llo wo r ld' {{ value3|cut:' ' }}<br> #import datetime #value4=datetime.datetime.now() {{ value4|date:'Y-m-d' }}<br> #value5=[] {{ value5|default:'空的' }}<br> #value6='<a href="#">跳转</a>' {{ value6 }} {% autoescape off %} {{ value6 }} {% endautoescape %} {{ value6|safe }}<br> {{ value6|striptags }} #value7='1234' {{ value7|filesizeformat }}<br> {{ value7|first }}<br> {{ value7|length }}<br> {{ value7|slice:":-1" }}<br> #value8='http://www.baidu.com/?a=1&b=3' {{ value8|urlencode }}<br> value9='hello I am yuan'