django开发

开发能力太弱了,学学django的开发….

0x00 环境搭建

生成虚拟环境,在其中的环境配置不会影响主配置

vitualenv

pip install virtualenv
virtualenv my_env			//生成虚拟目录
source my_env/bin/activate			//激活环境
source my_env/bin/deactivate			//禁用

Django

pip install Django === 2.0.5
django-admin startproject d3vil_pylearn			//生成项目
python manage.py migrate					//生成对应数据表
python manage.py runserver

__init_文件,将该目录视为一个模块

_setting.py,项目设置

_urls.py,项目路由

_wsgi.py,服务器网关接口运行项目

到此就创建了django的框架,接下来我们要在此框架上进行功能的完善。

python manage.py startapp blog

admin.py 注册模型

apps.py 主要配置

migrations 数据库迁移,跟踪模块变化,同步数据库

models.py 数据模型

tests.py 测试

views.py 接收请求,响应视图

初步了解django后,发现其mvc思想随处可见,setting.py里面包含了需要的配置文件,在migrate时主要针对此中的app进行数据库表的配置,而每一个app中又有个model来进行数据模型的定义,均用一个model类的子类来进行定义,封装了一些诸如datetimeField,CharField等的数据结构定义。view来进行显示

在进行完model的数据模型设计后,我们将这个app引入到我们的项目设置中来再

python manage.py makemigrations polls
就可以完成数据表建立
python manage.py sqlmigrate polls 0001
不对,只是生成了对应的migration文件,现在这个是搞对应的sql语句
看来django通过这个来实现可移植性
BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
 "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMEN
T, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
 "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id"
 integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEF
ERRED);
INSERT INTO "polls_choice" ("id", "choice_text", "votes", "question_id") SELE
CT "id", "choice_text", "votes", NULL FROM "polls_choice__old";
DROP TABLE "polls_choice__old";
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question
_id");
COMMIT;

Then execute migrate to execute sql.

然后是数据库的操作

在建立好数据库后,查询操作如下

from polls.models import Choice, Question			引入类

Question.objects.all()								查询类比于select * from 表QUEStion
Question.objects.filter(id=1)						select * from Question where id=1
Question.objects.filter(question_text__startswith='What')
Question.objects.get(pub_date__year=current_year)
注意get和filter方法不同,get能把对象取出来然后才能调用这个方法

因为关系数据的原因,choice里的question是Question的外键,接下来迷惑操作警告
q.choice_set.all()		查询Question对象的choice对象
q.choice_set.create(choice_text='Not much', votes=0)		设置一个
c = q.choice_set.create(choice_text='Just hacking again', votes=0)
c是一个choice对象确可以调用related objects,可能是用的子类实现外键?
>>> c.question
<Question: What's up?>
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
c.delete()就可以

创造管理员

$ python manage.py createsuperuser

但我们的admin管理页面里还没有我们的polls数据,

from django.contrib import admin

# Register your models here.
from .models import Question

admin.site.register(Question)

这样在admin.py里注册我们的模型,就可以在后台中进行管理

踩了个坑,显示旧表不存在,更新了下django,3.10就可以了

嗯,今天就这样,明天开始对这个投票程序的view进行创建

​ 总结下,今天开始了django的学习,这个框架非常的灵活,且mvc的思想随处可见,项目的配置文件主要由setting.py进行配置,应用了哪个app,而对应的数据模型在各个app的model里进行设计修改,会先对model进行生成迁移的操作,我们也可以在执行前看到sql语句,总的操作均通过migrate来操作。然后也是数据表的操作靠model里面的数据对象类来实现,对象之间可以用外键建立联系,子类执行父类方法。然后是管理员界面可对数据进行直接操作。

视图

今天开始视图部分的学习,估了一天,昨天去挖asrc了,这两天学了xss不少,原来以为htmlspecialchar之后就无解了,原来一个实体化就饶过了….每天亿点点学习….

​ 好回归正题。

def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)

def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

首先在view.py里创造不同的路由函数

from django.urls import path

from . import views

urlpatterns = [
    # ex: /polls/
    path('', views.index, name='index'),
    # ex: /polls/5/
    path('<int:question_id>/', views.detail, name='detail'),
    # ex: /polls/5/results/
    path('<int:question_id>/results/', views.results, name='results'),
    # ex: /polls/5/vote/
    path('<int:question_id>/vote/', views.vote, name='vote'),
]

在url.py中加入我们的路由

只要我们的url对应了url.py里面的参数,就会去调用对应的函数处理相应的请求,同理访问/polls/5/results/就会调用results函数。

试下xss?emmm,是int型的,不得行

嗯,把对应接口改成str后就可以x了,不会真有菜鸟开发员这样写吧?不会吧不会吧。

有了视图后,怎么更方便更好看呢??

模板。

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

emmm,试了下放在text那里咋不行馁…..

嗯,睡了睡了。。。mmp最后这个模型是懵逼的慢慢做两个应用吧。。。

明天开始做blog app

Blog


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

xss_train Previous
账户权限认证 Next