Django框架
1 自己开发Web框架
开发Web框架涉及的内容
-
socket
-
http协议
无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了
-
HTML知识
-
数据库(pymysql,SQLAlchemery)
互联网的通信都是基于sock进行通信的
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. 响应:“好”
用户断开
下面的代码构成了一个简单的web框架:
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\r\n\r\n")
conn.send(b'123123')
conn.close()
2 Django 框架配置
2.1 新建Django工程
2.1.1 在cmd中建立工程
django-admin startproject 工程名
Python3 manage.py runserver
2.2 设置HTML模板路径
新建HTML的模板存放的文件templates,之后在setting配置文件中添加templates的路径:
'DIRS': [os.path.join(BASE_DIR,'templates')],
2.3 配置静态文件路径
静态文件包括css文件,js文件,图片等
新建静态文件static(可以是别的名字),在setting文件中添加
STATIC_URL = '/static/'
STATICFILES_DIRS =(
os.path.join(BASE_DIR,'static'), #这里是拼接存放css文件的路径,修改路径的名字时,会自动修改
)
注意:
- 拼接路径,最后用逗号,否则会报错
- 这里的static代表前缀,在HTML文件中引入css文件的时候在前面添加,
<link rel="stylesheet" href="/static/comments.css"> 这里的static是前缀
2.4注释一句
这里先把setting中下面的一句话注释
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',
]
2.5 django工程目录
mysite
| - mysite ===============对整个程序进行配置
| - __init__.py
| - settings.py ============配置文件
| - url.py ==============URL对应关系
| - wsgi.py ============遵循WSGI规范,上线一般使用uwsgi+nginx
| - manage.py ============管理Django程序 : python manage.py
: python manage.py startapp xxx
: python manage.py makemigrations
: python manage.py migrate
3 Django 路由系统
路由系统是对URL进行的配置,urls.py文件中进行操作
from django.shortcuts import HttpResponse,render
def login(request):
# 需要加参数request,拿到所有的内容
return HttpResponse('hello') # 封装的对象 直接返回内容
def index(request):
return render(request,'index.html')# render 加request参数和HTML文件
urlpatterns = [
#url(r'^admin/', admin.site.urls),
url(r'^login/', login),
url(r'^index/', index), # index是函数名
]
4 模板标记
HTML文件在django中是作为模板使用的,因为涉及数据的交互,所以是动态的,通常是把内容添加到HTML中。在HTML中是通过特殊符号进行占位的,称为模板标记。
模板的原理是:http是传输的过程中国是通过响应头和相应体进行通信的。中间是两个换行符。传输的是字节,模板是通过字符拼接的,形成完整的响应体
在django中是通过{{ }}对模板进行添加的
添加的方式:
- 通过字典的方式
- 通过列表取,索引用. 的方法
- 通过for循环取
能够和HTML结合起来使用
<body>
<h1>index</h1>
<p>{{ name }}</p>
<p>{{ users.0 }}</p>
<p>{{ users.1 }}</p>
<p>{{ user_dict.k1 }}</p>
<p>{{ user_dict.k2 }}</p>
<p>循环</p>
<ul>
{% for item in users %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<table border="1px">
{% for row in user_list_dict %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
<td>{{ row.email }}</td>
<td>
<a href="">编辑</a> |<a href="/del/?nid={{ row.id }}">删除</a>
</td>
</tr>
{% endfor %}
</table>
</body>
def index(request):
return render(request, 'index.html',
{
'name':'abc',
'users':['aaa','bbb'],
'user_dict':{'k1':'v1','k2':'v2'},
'user_list_dict':[
{'id':1,'name':'aaa','email':'aaa@aaa.com'},
{'id':2,'name':'bbb','email':'bbb@bbb.com'},
{'id':3,'name':'ccc','email':'ccc@ccc.com'},
]
})
return redirect('/index/') # 重定向才行 上面不行
使用render跳转不行
参考内容:
http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html