s4day63内容回顾:
1. 安装
2. 创建用户 + 授权
3.
连接
- 数据库
终端创建数据库(字符编码)
- 数据表
终端
ORM
pymysql
create ...)engine=innodb
- 数据行
增
删
改
查
- limit
- group by
....
关闭
问题:简述ORM原理?
day64内容
1. 自己开发Web框架
- socket
- http协议
- HTML知识
- 数据库(pymysql,SQLAlchemy)
HTTP特点:
无状态、短连接
TCP:
不断开
WEB应用(网站):
Http协议:
发送:
POST /index HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
HTTPS: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni
p=123
响应:
200 OK
Cache-Control:public, max-age=15
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Wed, 14 Jun 2017 01:21:17 GMT
Expires:Wed, 14 Jun 2017 01:21:33 GMT
Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Frame-Options:SAMEORIGIN
X-UA-Compatible:IE=10
用户在页面看到的内容“字符串”(看到页面效果,由于浏览器解析)
浏览器(socket客户端)
2. www.cnblogs.com
(42.121.252.58,80)
sk.socket()
sk.connect((42.121.252.58,80))
sk.send('我想要xx')
5. 接收
6. 连接断开
博客园(socket服务端)
1. 监听ip和端口(42.121.252.58,80)
while True:
用户 = 等待用户连接
3. 收到'我想要xx'
4. 响应:“好”
用户断开
连接示例
import socket sock = socket.socket() sock.bind(('127.0.0.1',8080)) sock.listen(5) while True: conn,addr = sock.accept() # hang住 # 有人来连接了 # 获取用户发送的数据 data = conn.recv(8096) conn.send(b"HTTP/1.1 200 OK ") conn.send(b'123123') conn.close()
2. Django框架
常见python web框架:django(内容大而全),tornado,flask(轻量级),web.py(尽量不用)
form表单验证
操作数据库
缓存
wsgiref实现网关接口 WSGI:(Web Server Gateway Interface),业务开发中尽量用UWSGI.
讲Django之前时说的web 框架原理:
创建完项目(project)之后,写代码之前先配置模板路径(template),静态文件
python manage.py runserver运行起来,就能访问了 127.0.0.1:8000/login
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', MIDDLEWARE中含有CSRF这一行注释掉
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3.函数
函数至少一个参数(request) request包括请求相关的所有信息
request.method获取用户的提交方式,request.post获取用户以POST方式用表单提交过来的数据
request.get获取用户以GET方式在URL上提交过来的数据
函数返回数据:return值有:
1.return http response 返回字符串用的;
2.return render 给他一个数据,给他一个模板(html文件)
3.return redirect,重定向到某个URL地址
模板渲染的时候,还可以利用Django提供的渲染机制,模板:两个大括号,中间写个值,如{{ name }}.
静态文件后面记得加括号
urls多加了一个条件,多加了一个对应关系
以POST方式提交数据的时候,不光request.post有值,request.get里面也有值
以GET方式提交数据的时候,只有request.get有值
GET请求--->只有request.GET有值
POST请求--->request.POST和request.GET都有值
4.url对应关系
/login/ login
def login(request):
request.method
request.POST->请求体
request.GET->请求头
导入的模块如下
from django.conf.urls import url from django.contrib import admin from django.shortcuts import HttpResponse,render,redirect
return HttpResponse(返回字符串)
return render(request,'login.html',{}) :执行渲染
return redirect('要跳转的网址') (redirect:重定向)
5.模板引擎中的特殊标记
login.html
{{name}} :name这个特殊标记就换成了alex
def login(request):
return render(request,'login.html',{'name':'alex'}) : {'name':'alex'}字典
<p>{{ users.0 }}</p> 取列表里的第一个值
<p>{{ users.1 }}</p> 取列表里的第二个值
模板里的特殊标记里还支持循环
{% for item in users %}
{{ item }}
{% endfor %}
<table>
{% for row in user_list_dict %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
<td>{{ row.email }}</td>
</tr>
{% endfor %}
</table>每一次循环进来生成一个tr(table row)
今日作业 Django+pymysql实现 -用户登录 -查看用户列表 1 alex alex3714@163.com 编辑 | 删除 点击删除,跳转到另外一个地址 2 alex alex3714@126.com 编辑 | 删除 3 alex alex3714@gmail.com 编辑 | 删除
总结:Django(必须学会,web框架着重理解)
web框架:模板引擎+路由映射+socket
Django用于快速开发网站,快速开发业务系统(BBS+豆瓣)
Django安装: pip3 install django
Django启动: 在cmd下运行 django-admin startproject 文件夹名(比如mysite),在对应磁盘创建相应的mysite目录
D:Program FilesPython36Scripts文件夹下出现一个exe文件django-admin.exe和一个django-admin.py
D:Program FilesPython36Scripts这一段加到Windows环境变量
WSGI:web服务网关接口
wsgiref,uwsgi 两个模块
D:mysitemysite 有三个文件:
1.settings.py:存放Django的配置文件,
2.urls.py存放URL和函数的对应关系,起名叫:路由系统,
3.wsgi.py:用于定义Django用socket,wsgiref,uwsgi(性能高),调用wsgiref这个模块,wsgi是web服务网关接口,是一个协议,
这个协议按照这个规则实现socket,wsgiref是实现这个协议的.
C:Usersing>django-admin startproject bingsite 启动Django服务
C:Usersing>D:
D:>cd bingsite 切换目录
D:ingsite>python manage.py runserver 127.0.0.1:8090 连接服务
python manage.py runserver 后面不加ip+端口,默认会以127.0.0.1:8000启动
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
June 14, 2017 - 19:52:11
Django version 1.11.1, using settings 'bingsite.settings'
Starting development server at http://127.0.0.1:8090/
Quit the server with CTRL-BREAK.
在浏览器访问http://127.0.0.1:8090/ 这个地址:
It worked!
Congratulations on your first Django-powered page.
from django.shortcuts import HttpResponse导入模块内容
def login(request):
'''
:param (request):放置用户请求相关的所有信息(对象)
:return
'''
返回一个字符串
settings.py里的'DIRS': [os.path.join(BASE_DIR, 'templates')], 不管项目名下的模板名字如何改变,都不会影响程序
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], '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', ], }, }, ]
{%csrf_token%}这一句放在form标签里面:csrf_token用于表单验证。
笔记整理
一、WEB框架的本质
WEB框架的本质是 开启一个socket服务端,用户发送http请求(get/post),服务端内部根据不同的URL请求,发送给用户不同的模板(html网页本质是发送字符串);
二、WEB框架的组成
1. socket服务端
绑定唯一IP+端口,不间断提供服务,让用户连接;
2、路由系统:URL -> 函数
根据不同URL请求,返回不同的模板;
3、模板引擎渲染:(包含在模板中特殊字符 % 特定数据的替换)
把特定数据(例如来自数据库) 根据包含在模板中(HTML网页)定义的特殊字符{{特殊字符}} ,替换组织成特定字符串整体发送给客户端。
三、WEB框架种类
第一类:同时满足1,2,3条件Tornado
第二类:[第三方1],2,3 --> wsgiref -例如Django
第三类: [第三方a],b,[第三方c] -例如: flask,
四、创建Django框架:
1、在CMD创建Django项目
1.1.安装Django模块:pip3 install django
1.2、创建Django程序 django-admin startproject mysite
1.3、进入程序目录 cd mysite
1.4、启动socket服务端,等待用户发送请求 python manage.py runserver 127.0.0.1:8080
2、在Pycharm创建Django项目
左上角file--->NewProject--->
五、Django目录配置
1、Django框架包含的文件说明:
seting.py -----Django的配置文件
url.py--------路由系统(url和函数的对应关系)
wsgi.py-------用于定义该Django程序,用什么socket来实现。wsgirof(测试环境) ,uwsgi(生产环境)
manage.py------对Django程序的所有操作和管理基于该程序例:Python manage.py run server 启动Django程序
2.配置
2.1、模板路径配置(html文件存放位置)
seting.py
TEMPLATES = [
{'DIRS': [os.path.join(BASE_DIR, 'templates')]
2.2、静态文件配置(CSS文件存放位置)
STATIC_URL = '/static/'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'),
)
2.3额外配置(注释)
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
总结:
1、创建project
2、配置
-------配置模板路径
-------配置静态文件路径
-------额外配置
六、使用Django
1、路由系统
urlpatterns = [url(r'URL/',URL对应的处理函数),]
urlpatterns = [url(r'login/',login),] ---------URL对应的函数
2、处理函数
请求相关:
request对象的属性和方法:(客户端请求相关)
request.method 提取请求的方法
request.get 提取get请求头的URL
request.POST 提取POST请求体,用户输入的数据体;
{'username': ['zhanggen'], 'password': ['123.com']}
返回相关:
return HttpResponse("666") #返回字符串
retrun redirect("http://www.baidu.com") 返回跳转的网页
render内部做模板渲染(把模板拿过来,把数据拿过来,把特殊字符做字符串替换)
return render(request, "logi.html",{'msg':"用户名或者密码错误"})(返回网页)
def login(request): # return HttpResponse("666") #返回字符串 if request.method=="GET": print(request.method) return render(request,"logi.html") # 返回静态文件 else: u=request.POST.get("username") p=request.POST.get("password") print(u,p) if u=="zhanggen" and p=="123.com": return redirect("http://www.baidu.com") else: return render(request, "logi.html",{'msg':"用户名或者密码错误"}) def index(request): return render(request,"index.html",{"name":"alex", "users":["李志","李杰"] ,"user_dict":{"k1":"v1","k2":"v2"}, 'user_name':[{'id':1,'name':"张根","gender":"man"}, {'id': 2, 'name': "游勤兵", "gender": "man"}, {'id': 3, 'name': "高路川", "gender": "man"} ] }) urlpatterns = [ url(r'login/',login), url(r'index/',index), ]
3、模板引擎中的特殊标记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ss</title> </head> <body> <h1>模板特殊标记</h1> <p>{{name}}</p> <p>{{users.0}}</p> <p>{{users.1}}</p> <p>{{user_dict.k2}}</p> <p>{{user_dict.k1}}</p> <h3>循环</h3> {% for item in user_dict %} <h1>{{ item }}</h1> {% endfor %} <table border="1"> {% for row in user_name%} <tr> <td>{{ row.id }}</td> <td>{{ row.name }}</td> <td>{{ row.gender }}</td> <td><a href="">编辑|删除</a></td> </tr> {% endfor %} </table> </body> </html>